本文主要解决两个问题:1. 搞清楚新旧版本接口 2. 不使用支付宝SDK调起支付宝客户端并成功回调。浏览方式建议先通读全文再细看。
- 目录
- 移动支付老版本和APP支付新版本接入对比
- 关于应用私钥的问题:
- webview里的支付宝H5链接调起支付宝
- 不使用支付宝SDK,调起支付宝的方案
- 新接口(APP支付)拼装调起客户端参数的方案
- 官方签名工具,强烈推荐
- 排查错误指南
- 一些有用的资料
移动支付老版本和APP支付新版本接入对比
- 什么是新接口,什么是老接口?当然也可以看上面的链接,就更加全面。
支付宝的更新迭代,所以产生了两套的接口。老的目前还能用,后面能不能用就不知道了。对于客户端支付相关的产品:老的叫移动支付,就是17年之前的,当然这也包括了后台部分。新的叫app支付,是17年之后的一套接口。所以可以根据大概时间去区分是哪种接口。
关于应用私钥的问题:
iOS客户端的话,使用pkcs8格式的应用私钥,后台的话,是java就用pkcs8,其它都用pkcs1格式的。
webview里的支付宝H5链接调起支付宝
这是不使用支付宝SDK的方案,老接口版本,支付宝调起客户端的问题:
- H5如何调起客户端支付宝,并且回调?
- 需要先我们用的是老接口还是新接口,对应的H5链接支持才可以。
若接入的是新版本手机网站支付接口(alipay.trade.wap.pay),用户在安装支付宝钱包的情况下,调用手机网站支付接口默认会唤起钱包支付;若接入的是手机网站支付老版本(alipay.wap.create.direct.pay.by.user ),那么需要在请求参数中加入app_pay参数并赋值为Y,详情参见 手机网站支付老版本文档;37用的是H5链接是老的,所以需要需要加入app_pay为Y的参数。 - 在上面支持之后,在我们的webview还是不能直接调起对应的app。我们需要拦截alipay://的请求,并且通过openURL的方式打开对应的app。需要注意白名单的问题。
- 最后就是要处理回调的问题,我的方案是在openurl里面处理的,拦截替换对应的参数。
- 为什么支付宝的demo还是会报错?
- 我们首先需要搞清楚,我们的是旧接口,还是新接口。如果你的demo是新的,但是只签约了旧方法,只配置了旧的公私钥,那么当然就会有问题。
不使用支付宝SDK,调起支付宝的方案
下面代码可以拼接出直接调起支付宝客户端(老版接口、移动支付)的串,文件需要更换应用私钥、partner、seller_id才可以。生成的iOSLink就是iOS可以直接调起openURL的链接了。
<?php
header('Access-Control-Allow-Origin: *');
header('Content-type: text/plain');
// 获取支付金额
$amount='';
if($_SERVER['REQUEST_METHOD']=='POST'){
$amount=$_POST['total'];
}else{
$amount=$_GET['total'];
}
$total = floatval($amount);
if(!$total){
$total = 1;
}
// 对签名字符串转义
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 = "-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDG5M5JEsQcm24X64POfn+pOOafqfyXxQTH8vZHngeRUu0lAXnW
xbU7cwK/2xJVqNDjWIko9dfkljsdfkjnqwe+wersdffjfp/7zb9Oa7bYnWxl2Yav
2sF5/sdfdsnfjklKlsd/flksdjfsldkf/gDbsjMLODcKJKuy1QNoi6eiwIDAQAB
AoGBAJxBH2s7KDULezehKGB+8w5gHJctNbuKVhI7544mMe3Sx2n+OdkoZBQ7a9qM
YmAXi1xArykVKLQMS6cutCLLfNLRVcXYmvgMi7oHPaTTYdbCQYtksCM80Qlyywdv
HVyXIKWrsGIFfXgemn8d/yTkdQKQFJNHHmPiYxHg9u/sdE4ZAkEA6a/vH6vzSJSp
9evtLvlBqNPtEOu1SEiHhsou4wUoqLC+RBpAW4SQkXRuIYBg/z/icZbAB2PIEyMp
EUMR8Zvf5wJBANniaF7s9aRVBhAhuGnZcqN4BT14/qJ2IbCiAZRmWD23hyCqT8u4
ZOGSCCjxm7A2278pm6d9LEOpaBUzj1XNB70CQE4q/Y/Ykr56jAeo7WPDGMWCblA0
qCUPrdXWl6x0s08KH/rj1RdH1pvxGD24hbmcAwD/7ia0H97W6gvOJZhuDY0CQAVe
hfHo5vjAu6CEJDY/jIqot4BXTfcU8CmSJG7SwtPqhOLyL3s2tQ21+ot/wLVr9KhW
Tsdkfjal;sdkfjaklsdjfqwiernzip9qjAW8gZQvc58jIqot4BXTfcU8CmSJG7Sw
Wf12R/7gGBYceyJ4xrlKY5RtrpC6qVEHLTvBtKKYZTc=
-----END RSA PRIVATE KEY-----";
$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 = "2088711882123456";
// 支付宝账号
$seller_id = 'test@qq.com';
// 商品网址
$base_path = "";
// 异步通知地址
$notify_url = "";
// 订单标题
$subject = '测试订单标题';
// 订单详情
$body = '测试订单内容';
// 订单号,示例代码使用时间值作为唯一的订单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);
//生成订单
$dataString = $orderInfo.'&sign="'.$sign.'"&sign_type="RSA"';
$iOSLink= "alipay://alipayclient/?".urlencode(json_encode(array('requestType' => 'SafePay', "fromAppUrlScheme" => /*iOS App的url schema,支付宝回调用*/"openshare","dataString"=>$dataString)));
echo $iOSLink;
?>
新接口(APP支付)拼装调起客户端参数的方案
注意事项:
可以参考下面的,务必确保已经签约《app支付》,并且已配置好对应的公玥私钥
https://blog.csdn.net/kunpeng1987/article/details/73649710
官方接口文档如下:
https://docs.open.alipay.com/204/105465
官方签名工具,强烈推荐
密钥部分可验签,还有相关的排查问题的一系列方法
排查错误指南
https://open.alipay.com/search/searchDetail.htm?tabType=doc&keyword=ALIN10146
还是在官方搜索比较靠谱。
image.png
一些有用的资料
https://github.com/dcloudio/H5P.Server/tree/master/payment/alipayrsa2
可以参考的后台返回值:
"alipayInfo": "_input_charset=\"utf-8\"&body=\"2018年09月03日杭州东-上海南\"&it_b_pay=\"30m\"¬ify_url=\"pay.tieyou.com/alipay_notify\"&out_trade_no=\"6701156951-108653793\"&partner=\"2088011641232983\"&payment_type=\"1\"&seller_id=\"2088011641232983\"&service=\"mobile.securitypay.pay\"&sign=\"wXClZZ6K%2FcZOTzn7tO3z9RXB0SQHredtVGzh9aUpNuTWfVlG1DzzINiVZ0YE5W5s5zZsreQcp29%2FhVelByNkSg%3D%3D\"&sign_type=\"RSA\"&subject=\"2018年09月03日杭州东-上海南\"&total_fee=\"69.00\""
网友评论