文章最早发布于我的微信公众号中,欢迎关注公众号 Android_De_Home 获取更多干货资源。
本文为sydMobile原创文章,可以随意转载,但请务必注明出处!
以前公司的支付都是用的ping++,最近一段时间想要修改成原生的支付,微信、支付都直接接入原生的,在实际开发中遇到了一些坑在这里写一下。
写之前必须先吐槽一下微信支付平台的文档,写的真是不怎么样,布局也很乱各种找,而且直接没有服务器的文档说明,这也是要写这个文档的原因吧。
流程介绍
流程图先来一张微信支付平台的流程图,这张图我觉得描述的非常清楚。
流程大体就是这样的:用户打开商户APP然后选择购买某个产品后,在商户APP端选择下单的时候,这个时候我们商户APP需要做的请求我们自己的服务器生成支付订单,然后商户服务器这个时候收到来自商户APP的请求就调用微信API统一下单,这个时候微信的支付系统就会为我们生成预付单,然后返回给我们的商户服务器,然后商户服务器需要做的就是把微信支付系统返回的这些信息根据一定的规则加密后,把加密后生成的字符作为签名,然后返回给商户APP客服端,商户APP客户端拿到这些信息后就可以调用微信支付了,然后微信客户的向微信支付系统发起支付请求,这个时候微信的支付系统会根据我们传给微信客户端的参数来验证是否和服务器统一下单的时候的信息相吻合,验证成功后获取支付授权等待用户输入密码就开始进行支付。同时异步向商户服务器端发送支付结果通知,这个时候服务器需要接受并保存支付通知。并且返回给微信支付系统告诉已成功接受处理。同时微信支付系统会返回支付结果给微信客户端,这个时候微信客户端通过商户APP已实现的回调方法执行回调,商户APP需要根据回调信息做出具体的业务的处理,并且向自己的后台服务器查询支付结果最终支付结果是商户后台服务器说了算,接到自己的后台服务器返回的支付结果后进行业务处理就可以了。
Android客户端具体实现过程
其实支付商户APP客户端需要的做的事情很简单,无非就是拿到自己后台服务器的签名信息后调起微信客户端进行支付,然后微信客户会有一个回调,商户APP需要在这个回调里面处理自己的一些业务逻辑就OK了。
具体步骤:
- 导入微信支付SDK
Android Studio开发工具:
直接在代码中添加
dependencies {
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
}
即可,注意如果你已经接入了友盟分享等用到微信分享的SDK就不用再次导入SDK了,因为你在用友盟分享的时候实际上就已经导入了,如果再次导入就会出现冲突了。
Eclipse开发工具:
下载jar包导入项目中添加依赖
- 在微信开发者平台创建应用,注意创建的应用的包名一定要和你开发的APP的包名对应起来,并且创建应用的时候填入的APP签名必须是你开发的APP打包的时候的那个keystore。这很重要,很多调起支付不成功就是因为这个原因。
- 拿到服务器返回的签名信息调起微信支付
- 注册APPID
商户APP工程中引入微信JAR包,调用API前,需要先向微信注册您的APPID,代码如下:
final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
// 将该app注册到微信
msgApi.registerApp("你在开发者平台所创建应用的APPid"); - 商户服务器生成支付订单,先调用统一下单API生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。然后客户端调起微信支付
IWXAPI api;
PayReq request = new PayReq();
request.appId = "后台服务获取";
request.partnerId = "后台服务获取 ";
request.prepayId= " 后台服务获取",;
request.packageValue = "Sign=WXPay";
request.nonceStr= "后台服务获取";
request.timeStamp= "后台服务获取";
request.sign= "后台服务获取";
api.sendReq(req);
这个时候就会调起微信支付了 - 处理回调
在支付的时候微信客户端会回调这个时候会给商户APP发送支付结果通知,这个结果不能作为真正支付成功的判断,真正交易成功需要以自己的后台服务器为准
在下面文件创建这个回调
你应用的包名.wxapi.WXPayEntryActivity 路径一定是这样的不然不会回调。
WXPayEntryActivity 这个类要实现一个接口 IWXAPIEventHandler
public voidon Resp(BaseRespresp){
根据返回信息作出具体的业务逻辑
再一次请求自己的服务器获取支付结果
}
注意 WXPayEntryActivity 要在清单文件中注册
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop"/>
这样微信支付在APP客户端的整个流程就完成了
服务器端签名规则
参考微信文档说明
1、签名算法
(签名校验工具)签名生成的通用步骤如下:
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
◆ 参数名ASCII码从小到大排序(字典序);
◆ 如果参数的值为空不参与签名;
◆ 参数名区分大小写;
◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
◆ key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置
注意的是当调用统一订单返回的内容需要服务器端再次签名然后给用户端
注意的细节
有可能造成支付不能回调的原因:如果你之前已经在项目里面集成过ping++那注意要把
<activity-alias
android:name="替换成自己APK的包名.wxapi.WXPayEntryActivity"
android:exported="true"
android:targetActivity="com.pingplusplus.android.PaymentActivity" />
注释了
扫一扫关注微信公众号,获取更多干货和资源
网友评论