网站首页 > 知识剖析 正文
一、开发前提
APP支付又称移动端支付,是商户通过在移动端应用APP中集成开放SDK调起微信支付模块完成支付的模式。
本文档旨在指导开发者快速集成微信APP支付,包括开发者帐号申请、服务器配置以及安卓端配置。
1、开发者资质认证
登录微信开放平台:https://open.weixin.qq.com如图:在帐号中心里,选择开发者资质认证,根据申请引导进行申请,等待审核通过即可
2、创建应用
如图:在管理中心里,选择移动应用,点击创建移动应用
创建应用时要求填写应用签名和应用包名,应用签名可以通过软件查看:下载地址,包名可以查看AndroidManifest.xml中声明的package值
填写各项信息之后,等待审核通过,即可获得如下权限:
3、申请开通微信支付
应用审核通过后若想获取微信支付能力,需要申请开通微信支付功能,根据申请引导申请即可
4、了解支付流程
以下是交互时序图,统一下单API、支付结果通知API和查询订单API等都涉及签名过程,调用都必须在商户服务器端完成。
二、服务器配置
参考文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1
1、统一下单
商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易回话标识后再在APP里面调起支付。
接口地址:https://api.mch.weixin.qq.com/pay/unifiedorder
必传参数:
2、在线验证签名
微信提供了在线验证签名,以检测开发者调用微信公众平台开发者API时发送的请求参数是否正确
在线验证地址:https://pay.weixin.qq.com/wiki/tools/signverify/
如图:填写各项参数,点击生成签名,然后将生成的#4.最终的提交xml的内容提交给统一支付下单接口即可。
3、再次验签
商户系统调用统一下单接口后在微信支付服务后台生成预支付交易订(prepay_id),返回正确的预支付交易回话标识后再将APP端需要的参数进行签名,然后返回给APP,再在APP里面调起支付。
统一下单接口返回结果如下:
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><![CDATA[wxdf5a5e8166b65d8e]]></appid>
<mch_id><![CDATA[1413719303]]></mch_id>
<nonce_str><![CDATA[cCKl1CPUKbc1Viu1]]></nonce_str>
<sign><![CDATA[A457DA342972CE8EB86C9BFA46BDFC86]]></sign>
<result_code><![CDATA[SUCCESS]]></result_code>
<prepay_id><![CDATA[wx20161123112638700583976e0487596811]]></prepay_id>
<trade_type><![CDATA[APP]]></trade_type>
</xml>
然后,将APP端需要的参数再次签名,然后将参数和签名返回给APP端如图,签名的参数至少为以下几个:(appid、partnerid、noncestr、package、prepayid、timestamp)
4、注意事项
调用统一下单接口需要验签,收到返回结果之后,还需要将APP调起支付所需要的参数再次验签,然后再返回给APP端,在APP端调起支付即可。
三、Android端配置
参考文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
1、注册APPID
商户APP工程中引入微信JAR包,调用API前,需要先向微信注册您的APPID,代码如下:
IWXAPI msgApi;
msgApi = WXAPIFactory.createWXAPI(this, null);
msgApi.registerApp("wxdf5a5e8166b65d8e");// 将该app注册到微信
经测试:以下组合均能注册成功
msgApi = WXAPIFactory.createWXAPI(this, "wxdf5a5e8166b65d8e", true);
msgApi.registerApp("wxdf5a5e8166b65d8e");
msgApi = WXAPIFactory.createWXAPI(this, "wxdf5a5e8166b65d8e", false);
msgApi.registerApp("wxdf5a5e8166b65d8e");
msgApi = WXAPIFactory.createWXAPI(this, "wxdf5a5e8166b65d8e");
msgApi.registerApp("wxdf5a5e8166b65d8e");
2、调起支付
商户服务器生成支付订单,先调用统一下单接口生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。以下是调起微信支付的关键代码:
//msgApi,不用重新声明,使用注册时的就行
PayReq request = new PayReq();
request.appId = "wxdf5a5e8166b65d8e";
request.partnerId = "1413719303";
request.prepayId = "wx2016112309404508902deea40216174377";
request.nonceStr = "pFDVAPrK4R5okMYg";
request.timeStamp = "1456552292";
request.packageValue = "Sign=WXPay";
request.sign = "68F28572072B187B5F27E1542BEE05F6";
msgApi.sendReq(request);
APP端调起支付的参数列表可参考:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_12
3、支付结果回调
参照微信SDK Sample,在net.sourceforge.simcpux.wxapi包路径中实现WXPayEntryActivity类(包名或类名不一致会造成无法回调,例如我的包名是com.juemuren.weixinzhifu,则该类需要放在com.juemuren.weixinzhifu.wxapi中) 在manifest文件中注册:
<activity android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop"/>
在WXPayEntryActivity类中实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。代码示例如下:
@Override
public void onResp(BaseResp resp) {
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
Log.e("resp.errCode=", resp.errCode + "");
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("提示");
builder.setMessage("支付结果" + String.valueOf(resp.errCode));
builder.show();
}
}
回调中errCode值列表:
字段名变量名必填类型示例值描述返回状态码return_code是String(16)SUCCESSSUCCESS/FAIL SUCCESS表示商户接收通知成功并校验成功返回信息return_msg否String(128)OK返回信息,如非空,为错误原因:签名失败 参数格式校验错误
4、注意事项
实际支付结果一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。
确认debug或者打包运行的程序签名与微信开发平台设置的签名一致(使用下面任意一种方法):①、可以设置后台的签名为debug包的签名,这样每次直接运行即可,待程序发布之前再将签名修改为正式包的签名②、若使用的正式包的签名,则每次都要打包运行,或者可以在build.gradle中的android标签中添加下面的代码(推荐):
signingConfigs {
debug {
storeFile file("正式keystore的路径")
storePassword "密码"
keyAlias "别名"
keyPassword "密码"
}
}
猜你喜欢
- 2024-12-03 微信上其实还有很多你不知道的事,Python微信平台开发编写实录
- 2024-12-03 开发技巧汇总|对于imag.js你不知道的事
- 2024-12-03 手把手教你 5 分钟将公司 CEO 数字克隆装进公众号...
- 2024-12-03 DTD语法详细教程:DTD语法详解
- 2024-12-03 解读微信公众平台多客服功能
- 2024-12-03 OpenCart3 插件开发步骤
- 2024-12-03 微信公众号调试时“该公众号提供的服务出现故障,请稍后再试”
- 2024-12-03 小程序支付流程
- 2024-12-03 微信现金红包支付介绍和使用操作流程
- 2024-12-03 MIME 类型大全,你值得收藏
- 最近发表
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)