业务流程
以下是交互时序图,统一下单API、支付结果通知API和查询订单API等都涉及签名过程,调用都必须在商户服务器端完成
APP支付时序图
步骤1用户在商户APP中选择商品,提交订单,选择微信支付。
步骤3下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。
APP端开发步骤
IOS开发要点说明
以下项目开发环境以Xcode6.0,运行环境为IOS7.0为例,说明其开发中需要的操作。
1、项目设置APPID
商户在微信开放平台申请开发APP应用后,微信开放平台会生成APP的唯一标识APPID。在Xcode中打开项目,设置项目属性中的URL Schemes为您的APPID。如图8.7标红位置所示。
图8.7
2、注册APPID
商户APP工程中引入微信lib库和头文件,调用API前,需要先向微信注册您的APPID,代码如下:

1[WXApi registerApp:@"wxd930ea5d5a258f4f" withDescription:@"demo 2.0"];
3、调起支付
商户服务器生成支付订单,先调用【下单API】生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。以下是调起微信支付的关键代码:

1PayReq *request = [[[PayReq alloc] init] autorelease];
2request.partnerId = @"10000100";
3request.prepayId= @"1101000000140415649af9fc314aa427";
4request.package = @"Sign=WXPay";
5request.nonceStr= @"a462b76e7436e98e0ed6e13c64b4fd1c";
6request.timeStamp= @"1397527777";
7request.sign= @"582282d72dd2b03ad892830965f428cb16e7a256";
8[WXApi safeSendReq:request];
4、支付结果回调
照微信SDK Sample,在类实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意 一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。代码示例如下:

1- (void)onResp:(BaseResp *)resp {
2 if ([resp isKindOfClass:[PayResp class]]) {
3 PayResp *response = (PayResp *)resp;
4 switch (response.errCode) {
5 case WXSuccess:
6
7 NSlog(@"Payment Successful");
8 break;
9 default:
10 NSlog(@"Payment Failed, retcode=%d",resp.errCode);
11 break;
12 }
13 }
14}
|
0 | 成功 | 展示成功页面 |
-1 | 错误 | 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。 |
-2 | 用户取消 | 无需处理。发生场景:用户不支付了,点击取消,返回APP。 |
Android开发要点说明
1、后台设置
商户在微信开放平台申请开发应用后,微信开放平台会生成APP的唯一标识APPID。由于需要保证支付安全,需要在开放平台绑定商户应用包名和应用签名,设置好后才能正常发起支付。设置界面在【开放平台】中的栏目【管理中心 / 修改应用 / 修改开发信息】里面,如图8.8红框内所示
图8.8
应用包名:是在APP项目配置文件AndroidManifest.xml中声明的package值,例如DEMO中的package="net.sourceforge.simcpux"。
应用签名:根据项目的应用包名和编译使用的keystore,可由签名工具生成一个32位的md5串,在调试的手机上安装签名工具后,运行可生成应用签名串,如图8.9所示,绿色串即应用签名。签名工具下载地址https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk
图8.9
2、注册APPID
商户APP工程中引入微信JAR包,调用API前,需要先向微信注册您的APPID,代码如下:

1final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
2// 将该app注册到微信
3msgApi.registerApp("wxd930ea5d5a258f4f");
3、调起支付
商户服务器生成支付订单,先调用统一下单API(详见第7节)生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。以下是调起微信支付的关键代码:

1IWXAPI api;
2PayReq request = new PayReq();
3request.appId = "wxd930ea5d5a258f4f";
4request.partnerId = "1900000109";
5request.prepayId= "1101000000140415649af9fc314aa427",;
6request.packageValue = "Sign=WXPay";
7request.nonceStr= "1101000000140429eb40476f8896f4c9";
8request.timeStamp= "1398746574";
9request.sign= "7FFECB600D7157C5AA49810D2D8F28BC2811827B";
10api.sendReq(request);
4、支付结果回调
参照微信SDK Sample,在net.sourceforge.simcpux.wxapi包路径中实现WXPayEntryActivity类(包名或类名不一致会造成无法回调),在WXPayEntryActivity类中实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。代码示例如下:

1public void onResp(BaseResp resp) {
2 if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
3 Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);
4 AlertDialog.Builder builder = new AlertDialog.Builder(this);
5 builder.setTitle(R.string.app_tip);
6 }
7}
|
0 | 成功 | 展示成功页面 |
-1 | 错误 | 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。 |
-2 | 用户取消 | 无需处理。发生场景:用户不支付了,点击取消,返回APP。 |
鸿蒙开发要点说明
1、配置鸿蒙应用信息
前往微信开放平台,在「管理中心 - 移动应用 - 详情 - 开发配置」中点击「编辑」进入修改开发信息的页面,继续在「平台信息」板块中填入鸿蒙应用所需的 Bundle ID 和 identifier 信息,然后提交审核,等待审核通过即可。
关于「鸿蒙应用」中的 Bundle ID、Identifier、以及应用下载地址的提供的说明如下:
注意事项:
2、下载鸿蒙开发的 IDE
前往鸿蒙官网下载 DevEco Studio NEXT
3、配置 sdk 依赖
在 DevEco Studio NEXT中打开你的项目,以 demo 工程为示例:
修改项目中的oh-package.json5文件,在dependencies中加入微信 opensdk 的依赖项:

1{
2 "name": "demo",
3 "version": "1.0.0",
4 "description": "Please describe the basic information.",
5 "main": "",
6 "author": "",
7 "license": "",
8 "dependencies": {
9 "@tencent/wechat_open_sdk": "1.0.0"
10 }
11}
4、调起支付
商户服务器生成支付订单,先调用【 统一下单 】生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。以下是调起微信支付的关键代码:

1import * as wxopensdk from '@wechat/open_sdk';
2
3
4export const WXApi = wxopensdk.WXAPIFactory.createWXAPI(APP_ID)
5
6
7class WXApiEventHandlerImpl implements wxopensdk.WXApiEventHandler {
8 private onReqCallbacks: Map<OnWXReq, OnWXReq> = new Map
9 private onRespCallbacks: Map<OnWXResp, OnWXResp> = new Map
10
11 registerOnWXReqCallback(on: OnWXReq) {
12 this.onReqCallbacks.set(on, on)
13 }
14 unregisterOnWXReqCallback(on: OnWXReq) {
15 this.onReqCallbacks.delete(on)
16 }
17
18 registerOnWXRespCallback(on: OnWXResp) {
19 this.onRespCallbacks.set(on, on)
20 }
21 unregisterOnWXRespCallback(on: OnWXResp) {
22 this.onRespCallbacks.delete(on)
23 }
24
25 onReq(req: wxopensdk.BaseReq): void {
26 Log.i(kTag, "onReq:%s", JSON.stringify(req))
27 this.onReqCallbacks.forEach((on) => {
28 on(req)
29 })
30 }
31
32 onResp(resp: wxopensdk.BaseResp): void {
33 Log.i(kTag, "onResp:%s", JSON.stringify(resp))
34 this.onRespCallbacks.forEach((on) => {
35 on(resp)
36 })
37 }
38}
39export const WXEventHandler = new WXApiEventHandlerImpl
40
41
42let req = new wxopensdk.PayReq
43req.appId = 'wxd930ea5d5a258f4f'
44req.partnerId = '1900000109'
45req.prepayId = '1101000000140415649af9fc314aa427'
46req.packageValue = 'Sign=WXPay'
47req.nonceStr = '1101000000140429eb40476f8896f4c9'
48req.timeStamp = '1398746574'
49req.sign = '7FFECB600D7157C5AA49810D2D8F28BC2811827B'
50
51
52
53let finished = await this.wxApi.sendReq(context: common.UIAbilityContext, req)
54
55
56
57export default class EntryAbility extends UIAbility {
58 onCreate(want: Want, _launchParam: AbilityConstant.LaunchParam): void {
59 this.handleWeChatCallIfNeed(want)
60 }
61
62 onNewWant(want: Want, _launchParam: AbilityConstant.LaunchParam): void {
63 this.handleWeChatCallIfNeed(want)
64 }
65
66 private handleWeChatCallIfNeed(want: Want) {
67 WXApi.handleWant(want, WXEventHandler)
68 }
69}
5、支付结果回调
支付完成后,微信App会返回到商户App并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码。如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意一定不能以客户端返回作为用户支付的结果,应以服务器端接收的支付通知或查询API返回的结果为准。
示例代码:

1onResp(resp: wxopensdk.BaseResp): void {
2Log.i(kTag, "onResp:%s", JSON.stringify(resp))
3 this.onRespCallbacks.forEach((on) => {
4 on(resp)
5 })
6 }
回调中errCode值列表:
|
0 | 成功 | 展示成功页面 |
-1 | 错误 | 可能的原因:签名错误、未注册AppID、项目设置AppID不正确、注册的AppID与设置的不匹配、其他异常等 |
-2 | 用户取消 | 无需处理。发生场景:用户不支付了,点击取消,返回App |