导读:HBuilder 基座已实现H5 plus的支付API,现已集成支付宝快捷支付平台。使用支付功能前必须在支付宝网站开通快捷支付服务,并配置服务器生...
HBuilder 基座已实现H5 plus的支付API,现已集成支付宝快捷支付平台。使用支付功能前必须在支付宝网站开通”快捷支付“服务,并配置服务器生成订单信息。
开发指导
支付流程如下:
plus API使用步骤:
1. 调用plus.payment.getChannels()获取系统支持的支付通道;
2. 调用plus.payment.request()发起支付请求。
示例代码
var channel=null;
// 1. 获取支付通道
function plusReady(){
// 获取支付通道
plus.payment.getChannels(function(channels){
channel=channels[0];
},function(e){
alert("获取支付通道失败:"+e.message);
});
}
document.addEventListener('plusready',plusReady,false);
var ALIPAYSERVER='http://demo.dcloud.net.cn/helloh5/payment/alipay.php?total=';
var WXPAYSERVER='http://demo.dcloud.net.cn/helloh5/payment/wxpay.php?total=';
// 2. 发起支付请求
function pay(id){
// 从服务器请求支付订单
var PAYSERVER='';
if(id=='alipay'){
PAYSERVER=ALIPAYSERVER;
}else if(id=='wxpay'){
PAYSERVER=WXPAYSERVER;
}else{
plus.nativeUI.alert("不支持此支付通道!",null,"捐赠");
return;
}
var xhr=new XMLHttpRequest();
xhr.onreadystatechange=function(){
switch(xhr.readyState){
case 4:
if(xhr.status==200){
plus.payment.request(channel,xhr.responseText,function(result){
plus.nativeUI.alert("支付成功!",function(){
back();
});
},function(error){
plus.nativeUI.alert("支付失败:" + error.code);
});
}else{
alert("获取订单信息失败!");
}
break;
default:
break;
}
}
xhr.open('GET',PAYSERVER);
xhr.send();
}
注:第二步中获取到的订单数据需要在服务器通过支付宝平台获取PID和密钥生成。
HBuilder应用配置
分享插件添加方法具体步骤如下:
1. 双击应用的manifest.json文件,选中“使用第三方插件”
Ctrl+S保存。
-
点击manifest.json文件的“代码视图”,在permissions节点下添加Payment节点:
-
在plus -> distribute -> plugins 节点下添加payment节点:
alipay节点下配置支付宝相关信息
scheme值为iOS平台调用支付宝的“快捷支付”应用返回时用到的标识,推荐使用小写字符串。
weixin节点下配置微信支付相关信息
appid值为在微信开放平台申请应用的AppID值。
支付宝功能申请
- 登录支付宝账号,签约申请“移动快捷支付”功能,操作流程参考:
支付宝帮助中心
- 获取PID,参考教程:
获取合作者身份ID
- 生成密钥(公钥和私钥),并提交到支付宝,参考教程:
生成RSA密钥
上传公钥
服务器生成订单示例(PHP)
完整示例代码已开源到github
<?php
header('Content-type: text/plain');
// 获取支付金额
$amount='';
if($_SERVER['REQUEST_METHOD']=='POST'){
$amount=$_POST['total'];
}else{
$amount=$_GET['total'];
}
$total = floatval($amount);
if(!$total){
$total = 10;
}
// 对签名字符串转义
function createLinkstring($para) {
$arg = "";
while (list ($key, $val) = each ($para)) {
$arg.=$key.'="'.$val.'"&';
}
//去掉最后一个&字符
$arg = substr($arg,0,count($arg)-2);
//如果存在转义字符,那么去掉转义
if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}
return $arg;
}
// 签名生成订单信息
function rsaSign($data) {
$priKey = "%私钥%"; // 生成密钥时获取,直接使用pem文件的字符串
$res = openssl_get_privatekey($priKey);
openssl_sign($data, $sign, $res);
openssl_free_key($res);
$sign = base64_encode($sign);
$sign = urlencode($sign);
return $sign;
}
// 支付宝合作身份者ID,以2088开头的16位纯数字
$partner = "%PID%"; // 支付宝开通快捷支付功能后可获取
// 支付宝账号
$seller_id = "payservice@dcloud.io";
// 商品网址
$base_path = urlencode('http://demo.dcloud.net.cn/helloh5/payment/');
// 异步通知地址
$notify_url = urlencode('http://demo.dcloud.net.cn/helloh5/payment/notify.php');
// 订单标题
$subject = 'DCloud项目捐赠';
// 订单详情
$body = 'DCloud致力于打造HTML5最好的移动开发工具,包括终端的Runtime、云端的服务和IDE,同时提供各项配套的开发者服务。';
// 订单号,示例代码使用时间值作为唯一的订单ID号
$out_trade_no = date('YmdHis', time());
$parameter = array(
'service' => 'mobile.securitypay.pay', // 必填,接口名称,固定值
'partner' => $partner, // 必填,合作商户号
'_input_charset' => 'UTF-8', // 必填,参数编码字符集
'out_trade_no' => $out_trade_no, // 必填,商户网站唯一订单号
'subject' => $subject, // 必填,商品名称
'payment_type' => '1', // 必填,支付类型
'seller_id' => $seller_id, // 必填,卖家支付宝账号
'total_fee' => $total, // 必填,总金额,取值范围为[0.01,100000000.00]
'body' => $body, // 必填,商品详情
'it_b_pay' => '1d', // 可选,未付款交易的超时时间
'notify_url' => $notify_url, // 可选,服务器异步通知页面路径
'show_url' => $base_path // 可选,商品展示网站
);
//生成需要签名的订单
$orderInfo = createLinkstring($parameter);
//签名
$sign = rsaSign($orderInfo);
//生成订单
echo $orderInfo.'&sign="'.$sign.'"&sign_type="RSA"';
?>
C#生成支付宝订单示例
微信支付功能申请
-
使用微信支付功能需到微信开放平台申请移动应用并开通支付功能
微信APP支付接入商户服务中心
申请应用后可以获取AppID和AppSecret值。
-
开通支付功能后可获取支付业务服务器配置数据
PARTNER:财付通商户号
PARTNER_KEY:财付通密钥
PAYSIGNKEY:支付签名密钥
服务器生成订单示例(PHP)
<?php
header('Access-Control-Allow-Origin: *');
header('Content-type: text/plain');
require_once("classes/RequestHandler.class.php");
require_once("classes/ResponseHandler.class.php");
require("classes/client/TenpayHttpClient.class.php");
//财付通商户号
$PARTNER = "财付通商户号";
//财付通密钥
$PARTNER_KEY = "财付通密钥";
//appid
$APP_ID="移动应用AppID";
//appsecret
$APP_SECRET= "移动应用AppSecret";
//paysignkey(非appkey)
$APP_KEY="支付签名密钥";
//支付完成后的回调处理页面
$notify_url = "http://demo.dcloud.net.cn/helloh5/payment/wxnotify.php";
// 获取支付金额
$amount='';
if($_SERVER['REQUEST_METHOD']=='POST'){
$amount=$_POST['total'];
}else{
$amount=$_GET['total'];
}
$total = floatval($amount);
if(!$total){
$total = 1;
}
$total = $total*100; // 转成分
// 商品名称
$subject = 'DCloud项目捐赠';
// 订单号,示例代码使用时间值作为唯一的订单ID号
$out_trade_no = date('YmdHis', time());
$outparams =array();
//获取token值
$reqHandler = new RequestHandler();
$reqHandler->init($APP_ID, $APP_SECRET, $PARTNER_KEY, $APP_KEY);
$Token= $reqHandler->GetToken();
if ( $Token !='' ){
//=========================
//生成预支付单
//=========================
//设置packet支付参数
$packageParams =array();
$packageParams['bank_type'] = 'WX'; //支付类型
$packageParams['body'] = $subject; //商品描述
$packageParams['fee_type'] = '1'; //银行币种
$packageParams['input_charset'] = 'GBK'; //字符集
$packageParams['notify_url'] = $notify_url; //通知地址
$packageParams['out_trade_no'] = $out_trade_no; //商户订单号
$packageParams['partner'] = $PARTNER; //设置商户号
$packageParams['total_fee'] = $total; //商品总金额,以分为单位
$packageParams['spbill_create_ip']= $_SERVER['REMOTE_ADDR']; //支付机器IP
//获取package包
$package= $reqHandler->genPackage($packageParams);
$time_stamp = time();
$nonce_str = md5(rand());
//设置支付参数
$signParams =array();
$signParams['appid'] =$APP_ID;
$signParams['appkey'] =$APP_KEY;
$signParams['noncestr'] =$nonce_str;
$signParams['package'] =$package;
$signParams['timestamp']=$time_stamp;
$signParams['traceid'] = 'mytraceid_001';
//生成支付签名
$sign = $reqHandler->createSHA1Sign($signParams);
//增加非参与签名的额外参数
$signParams['sign_method'] ='sha1';
$signParams['app_signature'] =$sign;
//剔除appkey
unset($signParams['appkey']);
//获取prepayid
$prepayid=$reqHandler->sendPrepay($signParams);
if ($prepayid != null) {
$pack = 'Sign=WXPay';
//输出参数列表
$prePayParams =array();
$prePayParams['appid'] =$APP_ID;
$prePayParams['appkey'] =$APP_KEY;
$prePayParams['noncestr'] =$nonce_str;
$prePayParams['package'] =$pack;
$prePayParams['partnerid'] =$PARTNER;
$prePayParams['prepayid'] =$prepayid;
$prePayParams['timestamp'] =$time_stamp;
//生成签名
$sign=$reqHandler->createSHA1Sign($prePayParams);
$outparams['retcode']=0;
$outparams['retmsg']='ok';
$outparams['appid']=$APP_ID;
$outparams['noncestr']=$nonce_str;
$outparams['package']=$pack;
$outparams['partnerid']=$PARTNER;
$outparams['prepayid']=$prepayid;
$outparams['timestamp']=$time_stamp;
$outparams['sign']=$sign;
}else{
$outparams['retcode']=-2;
$outparams['retmsg']='错误:获取prepayId失败';
}
}else{
$outparams['retcode']=-1;
$outparams['retmsg']='错误:获取不到Token';
}
//Json 输出
ob_clean();
echo json_encode($outparams);
?>