iOS 微信支付以及左上角按钮的处理

大概说一下流程。
1.去微信开放平台注册应用。https://open.weixin.qq.com/(大概需要5天左右才能通过。)
2.应用审批后进一步去获得支付能力。(需要提供营业资格,法人或者负责人的身份证以及开户许可证,如果应用没有上线需要上传应用截图,具体的截图根据指示即可。)
3.微信审核后会在第二步提供的银行卡账户扣除小额不等的money,然后会把商户号、密码等等一些重要的信息发到提供的邮箱里。
4.登录微信商户平台。https://pay.weixin.qq.com/ 在商户平台里安装证书,配置一个秘钥(Key 必须是32位的,服务器签名要用)。

签名建议放在后端,前端不存放私钥。

1.配置QueriesSchemes

1
2
3
4
5
<key>LSApplicationQueriesSchemes</key>
<array>
<string>weixin</string>
<string>wechat</string>
</array>

2.配置URL Types.

工程 — 》 Targets —->info —->URL Types,填写在微信中申请的应用id。(跳转需要)

3.常用依赖库的添加。

4.如果项目跑不起来,报错需要设置bitcodeNO,那么设置即可。

前面的配置如果配置好,

//注册微信支付信息

第一步注册

1
[WeiXinPayTool RegistApp];

第二步设置好跳转

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#pragma mark - IOS9.0以后废弃了这两个方法的调用
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
//微信处理
if ([[WeiXinPayTool shareTool] handleOpenURL:url]) {
return YES;
}
return YES;
}
// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
//微信处理
if ([[WeiXinPayTool shareTool] handleOpenURL:url]) {
return YES;
}
return YES;
}

接下来只需要调用拿到后台传的一些参数(比如appid,partnerid,prepayid,package,noncestr 等,微信支付需要的参数)调起微信支付即可。
如果sendReq为NO,可能是签名不对,或者是参数有误。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
NSMutableString *stamp = [programs objectForKey:@"timestamp"];
//调起微信支付
PayReq* req = [[PayReq alloc] init];
req.partnerId = [programs objectForKey:@"partnerid"];
req.prepayId = [programs objectForKey:@"prepayid"];
req.nonceStr = [programs objectForKey:@"noncestr"];
req.timeStamp = [stamp intValue];
req.package = [programs objectForKey:@"package"];
req.sign = [programs objectForKey:@"sign"];
if (![WXApi isWXAppInstalled]) {
self.failed(ErrorCodeWXAppNotInstalled);
}
BOOL isSuccess = [WXApi sendReq:req];
NSLog(@"%d",isSuccess);
`

正常支付和取消支付都会走下面的回调。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
- (void)onResp:(BaseResp *)resp{
if([resp isKindOfClass:[PayResp class]]){
//支付返回结果,实际支付结果需要去微信服务器端查询
NSLog(@"%@",resp);
switch (resp.errCode) {
case WXSuccess:{
if (self.success) {
self.success();
}
}
break;
case WXErrCodeCommon:{
self.failed(ErrorCodeWxPayError);
}
break;
case WXErrCodeUserCancel:{
self.failed(ErrorCodeWxPayCancle);
}
break;
default:
break;
}
}
}

关于iOS9 之后应用左上角的返回按钮对微信支付的影响

iOS 9之后为了方便应用之间跳转,系统增加了左上角的返回按钮。可是在微信支付时,中途点击了左上角的返回按钮,此时我们就拿不到微信的回调。

我们需要的就是在下面两个方法里面其中一个方法里面发送通知,然后在通知页面调用微信的接口查询订单通知。如果生成的订单参数都是后台来负责签名的,查询订单也可以由后台来做,我们只需要传一个微信订单号(transaction_id)即可。

QQ20171206-145844.png

1
2
3
4
5
6
7
8
9
- (void)applicationWillEnterForeground:(UIApplication *)application {
// Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
发送通知,在通知页面查询微信的支付订单
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}