IOS系统opensdk升级指引 由于苹果公司在iOS13系统回收了查询 App bundleID 的能力,导致微信无法保证授权凭证能正确返回给AppID对应的应用。为此,微信支付强烈要求所有商户尽快升级到OpenSDK1.8.6,并让用户及时更新APP,否则安全风险将一直存在。谢谢配合!
opensdk升级后请一定按照文档要求完成验证工作,确保opensdk升级成功。
(以上截图来自opensdk升级指引)
IOS开发要点说明 以下项目开发环境以Xcode6.0,运行环境为IOS7.0为例,说明其开发中需要的操作。
1、项目设置APPID
商户在微信开放平台申请开发APP应用后,微信开放平台会生成APP的唯一标识APPID。在Xcode中打开项目,设置项目属性中的URL Schemes为您的APPID。如图8.7标红位置所示。
2、注册APPID
商户APP工程中引入微信lib库和头文件,调用API前,需要先向微信注册您的APPID,代码如下:
[WXApi registerApp:@"wxd930ea5d5a258f4f" withDescription:@"demo 2.0"];
3、调起支付
商户服务器生成支付订单,先调用【 统一下单API 】生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。以下是调起微信支付的关键代码:
1
2 PayReq *request = [[[PayReq alloc] init] autorelease];
3 request.partnerId = @"10000100";
4 request.prepayId= @"1101000000140415649af9fc314aa427";
5 request.package = @"Sign=WXPay";
6 request.nonceStr= @"a462b76e7436e98e0ed6e13c64b4fd1c";
7 request.timeStamp= @"1397527777";
8 request.sign= @"582282D72DD2B03AD892830965F428CB16E7A256";
9 [WXApi sendReq:request]; 注意:该sign生成字段名列表见 调起支付API
4、支付结果回调
照微信SDK Sample,在类实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意 一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。代码示例如下:
1
2 -(void)onResp:(BaseResp*)resp{
3 if ([respisKindOfClass:[PayRespclass]]){
4 PayResp*response=(PayResp*)resp;
5 switch(response.errCode){
6 caseWXSuccess:
7 //服务器端查询支付通知或查询API返回的结果再提示成功
8 NSlog(@"支付成功");
9 break;
10 default:
11 NSlog(@"支付失败,retcode=%d",resp.errCode);
12 break;
13 }
14 }
15 } 回调中errCode值列表:
0
成功
展示成功页面
-1
错误
可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
-2
用户取消
无需处理。发生场景:用户不支付了,点击取消,返回APP。
Android开发要点说明 商户在微信开放平台申请开发应用后,微信开放平台会生成APP的唯一标识APPID。由于需要保证支付安全,需要在开放平台绑定商户应用包名和应用签名,设置好后才能正常发起支付。设置界面在【开放平台】中的栏目【管理中心 / 修改应用 / 修改开发信息】里面,如图8.8红框内所示。
应用包名:是在APP项目配置文件AndroidManifest.xml中声明的package值,例如DEMO中的package="net.sourceforge.simcpux"。
应用签名:根据项目的应用包名和编译使用的keystore,可由签名工具生成一个32位的md5串,在调试的手机上安装签名工具后,运行可生成应用签名串,如图8.9所示,绿色串即应用签名。 点击下载 签名生成工具
2、注册APPID
商户APP工程中引入微信JAR包,调用API前,需要先向微信注册您的APPID,代码如下:
final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
// 将该app注册到微信
msgApi.registerApp("wxd930ea5d5a258f4f");
3、调起支付
商户服务器生成支付订单,先调用统一下单API(详见第7节)生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。以下是调起微信支付的关键代码:
1
2 IWXAPI api;
3 PayReq request = new PayReq();
4 request.appId = "wxd930ea5d5a258f4f";
5 request.partnerId = "1900000109";
6 request.prepayId= "1101000000140415649af9fc314aa427";
7 request.packageValue = "Sign=WXPay";
8 request.nonceStr= "1101000000140429eb40476f8896f4c9";
9 request.timeStamp= "1398746574";
10 request.sign= "7FFECB600D7157C5AA49810D2D8F28BC2811827B";
11 api.sendReq(request); 注意:该sign生成字段名列表见 调起支付API
4、支付结果回调
参照微信SDK Sample,在商户包名.wxapi包路径中实现WXPayEntryActivity类(包名或类名不一致会造成无法回调),在WXPayEntryActivity类中实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。代码示例如下:
1
2 public void onResp(BaseRespresp){
3 if(resp.getType()==ConstantsAPI.COMMAND_PAY_BY_WX){
4 Log.d(TAG,"onPayFinish,errCode="+resp.errCode);
5 AlertDialog.Builderbuilder=newAlertDialog.Builder(this);
6 builder.setTitle(R.string.app_tip);
7 }
8 } 回调中errCode值列表:
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、调起支付
商户服务器生成支付订单,先调用【 统一下单API 】生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。以下是调起微信支付的关键代码:
1 import * as wxopensdk from '@wechat/open_sdk' ;
2
3
4 export const WXApi = wxopensdk . WXAPIFactory . createWXAPI ( APP_ID )
5
6
7 class 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 }
39 export const WXEventHandler = new WXApiEventHandlerImpl
40
41
42 let req = new wxopensdk . PayReq
43 req . appId = 'wxd930ea5d5a258f4f'
44 req . partnerId = '1900000109'
45 req . prepayId = '1101000000140415649af9fc314aa427'
46 req . packageValue = 'Sign=WXPay'
47 req . nonceStr = '1101000000140429eb40476f8896f4c9'
48 req . timeStamp = '1398746574'
49 req . sign = '7FFECB600D7157C5AA49810D2D8F28BC2811827B'
50
51
52
53 let finished = await this . wxApi . sendReq ( context : common . UIAbilityContext , req )
54
55
56
57 export 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返回的结果为准。
示例代码:
1 onResp ( resp : wxopensdk . BaseResp ) : void {
2 Log . 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