前言、php
本文基于Hbuilder,使用mui、PHP进行开发html
最近作一个App支付的功能。大体流程是这样的:(官方文档有更详细的说明)git
描述:
1.开始支付,发起签名申请(签名必须在服务器端进行)
2.服务器端接口返回签名后的订单信息
3.根据接口返回的订单签名信息,调用支付宝App进行支付
4.输入支付密码确认付款【无须操做】
5.支付后返回支付结果【无须操做】
6.商家App接到支付结果,而后传递给接口
7.接口中根据支付结果进行验签
8.接口中确认完成以后返回给商家App支付完成。
9.支付宝异步通知支付结果
10.接口新增处理异步支付结果 须要外网可访问的地址github
其中一、3在本身的App中操做;二、九、10须要在服务器端进行;第六步我并无进行操做,直接进入支付结果页面,在支付结果页面判断订单的支付状态express
由于在支付成功的同时支付宝会马上异步发送信息给服务器端,即第九步,而后我在这里处理了支付单和订单状态,这样六、七、8就不须要操做了,直接进入结果页判断就好了。json
须要注意的是关于App的支付宝对接,有两个版本,一个是老版本(移动支付),一个是新版本(支付宝App支付)。有新版固然要用新版的了。服务器
能够使用支付宝给的sdk快速接入,App支付服务端DEMO&SDK,不嫌麻烦也能够本身写。。。。。微信
里面有demo,网上也不少。最终处理完以后,返回的是一个请求字符串,具体参数:请求参数说明app
推荐GitHub上的PHP签名模板:支付宝App支付新版 dom
生成的请求字符串:
app_id=2015052600090779&biz_content=%7B%22timeout_express%22%3A%2230m%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.01%22%2C%22subject%22%3A%221%22%2C%22body%22%3A%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%22%2C%22out_trade_no%22%3A%22IQJZSRC1YMQB5HU%22%7D&charset=utf-8&format=json&method=alipay.trade.app.pay¬ify_url=http%3A%2F%2Fdomain.merchant.com%2Fpayment_notify&sign_type=RSA2×tamp=2016-08-25%2020%3A26%3A31&version=1.0&sign=cYmuUnKi5QdBsoZEAbMXVMmRWjsuUj%2By48A2DvWAVVBuYkiBj13CFDHu2vZQvmOfkjE0YqCUQE04kqm9Xg3tIX8tPeIGIFtsIyp%2FM45w1ZsDOiduBbduGfRo1XRsvAyVAv2hCrBLLrDI5Vi7uZZ77Lo5J0PpUUWwyQGt0M4cj8g%3D
HBuilder 基座已实现H5 plus的支付API,现已支持支付宝App支付(移动快捷支付)和微信支付。咱们只须要在HBuilder中配置上就行了,具体配置查看: HBuilder支付插件配置
plus API使用步骤:
1. 调用plus.payment.getChannels()获取系统支持的支付通道
// 获取Hbuilder内置的支付通道 plus.payment.getChannels(function(channels){ for (var i in channels) { if (channels[i].id == "wxpay") { wxChannel=channels[i]; }else if(channels[i].id == "alipay"){ aliChannel=channels[i]; } } },function(e){ alert("获取支付通道失败:"+e.message); return 0; });
2. 调用plus.payment.request()发起支付请求。
//拉起支付 plus.payment.request(aliChannel,res.data.orderstr,function(result){ alert('支付成功'); console.log(JSON.stringify(result));//将会同步返回支付结果数据,根据本身需求进行处理,是否回传服务器 },function(error){ alert('支付失败'); console.log(JSON.stringify(error));//可查看状态码,失败信息 }); //说明:aliChannel是上面取到的对应内置支付通道信息,res.data.orderstr就是订单信息签名以后返回的请求字符串
在用户输入密码而且成功支付的同时,支付宝就会发送异步数据到你设置的 notifyUrl 中,
这里还须要验证签名:
$aop = new AopClient; $aop->alipayrsaPublicKey = '请填写支付宝公钥,一行字符串'; $flag = $aop->rsaCheckV1($_POST, NULL, "RSA2");
AopClient类中的一个方法 rsaCheckV1()就完成解签,以后须要进行一系列数据验证就完成了。
大部分问题:APP支付FAQ
关于:交易订单处理失败,请稍后再试 ALI38173 ,ALI38173出现确定是由于(二)中的签名参数错误或签名格式,仔细检查对比参数:请求参数说明
个人错误是:最后生成的字符串用htmlspecialchars进行转义了,实际不须要转义,按照GitHub中的文档编写彻底没有问题。
解决办法:复制官方文档中生成好的串,直接放在app中拉起支付,确认是服务器端仍是App端出错。
附上一个错误排查方案:https://blog.csdn.net/sinat_32575213/article/details/79695142
文中出现的连接:
/* 移动支付(老版):https://docs.open.alipay.com/59/104352/
支付宝App支付(新版):https://docs.open.alipay.com/204/105297/
App支付服务端DEMO&SDK:https://docs.open.alipay.com/54/106370
GitHub支付宝App支付新版(推荐):https://github.com/dcloudio/H5P.Server/tree/master/payment/alipayrsa2
订单签名参数说明:https://docs.open.alipay.com/204/105465/
HBuilder支付插件配置:http://ask.dcloud.net.cn/article/71 (这里面的支付宝的签名连接参数是老版本的,只看配置就ok)
APP支付FQA:https://support.open.alipay.com/docs/doc.htm?spm=a219a.7386797.0.0.JUPUDC&treeId=193&articleId=105849&docType=1#s8 */
其余文档:(只看上面的文档就足够了,下面文档有bug,仅供参考)
支付宝APP支付-php后台签名以及验签:https://blog.csdn.net/kunpeng1987/article/details/73649710
Dcloud中mui 微信支付和支付宝支付接口完美实现付款代码(PHP支付宝demo):https://www.erdangjiade.com/php/2475.html
支付宝官方文档,生成RSA密匙:https://docs.open.alipay.com/291/105971/