APP接入微信支付流程
最近的一个项目涉及到支付,这里就先说一下微信支付,像微信开发者申请,APP申请相信大家都非常熟悉,设计到支付,还需要申请支付功能,按照微信所要求的提供相关材料即可,接下来就等待审核结果吧。
微信支付流程及注意事项:
一.所需导入的类库
1.导入微信SDK
直接将微信SDK拉入工程即可,若使用了其他第三方如友盟,则可以忽略,因为友盟已经包含微信支付所需的相关文件,如下图
2.导入需要类库:根据微信开发文档
Security.framework
CoreTelephony.framework
SystemConfiguration.framework
libz.dylib
libsqlite3.0.dylib
UIKit.framework
Foundation.framework
// 微信官方的库
libWeChatSDK.a
二.注意事项
1.urlschemes 的设置
2.微信app的白名单加入
如果APP只涉及支付,不涉及第三方登录分享,这两个切记不要忘记填写
三.所需更改的文件
1.AppDelegate.h
导入#import "WXApi.h"当然还有<WXApiDelegate>
在didFinishLaunchingWithOptions 方法中初始化微信支付
[WXApi registerApp:@"你在微信开发者平台注册的APPId"];
在以下方法回调:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
#pragma mark - WXApiDelegate
-(void)onResp:(BaseResp *)resp {
if ([resp isKindOfClass:[PayResp class]]) {
PayResp*response=(PayResp*)resp; // 微信终端返回给第三方的关于支付结果的结构体
switch (response.errCode) {
case WXSuccess:
{// 支付成功,向后台发送消息
NSLog(@"支付成功");
[[NSNotificationCenter defaultCenter] postNotificationName:@"WeiXinPaysucceed" object:nil userInfo:nil];
}
break;
case WXErrCodeCommon:
{ //签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等
[SVProgressHUD showErrorWithStatus:@"支付失败"];
NSLog(@"支付失败");
}
break;
case WXErrCodeUserCancel:
{ //用户点击取消并返回
NSLog(@"取消支付");
[SVProgressHUD showErrorWithStatus:@"取消支付"];
}
break;
case WXErrCodeSentFail:
{ //发送失败
NSLog(@"发送失败");
[SVProgressHUD showErrorWithStatus:@"发送失败"];
}
break;
case WXErrCodeUnsupport:
{ //微信不支持
NSLog(@"微信不支持");
[SVProgressHUD showErrorWithStatus:@"微信不支持"];
}
break;
case WXErrCodeAuthDeny:
{ //授权失败
NSLog(@"授权失败");
[SVProgressHUD showErrorWithStatus:@"授权失败"];
}
break;
default:
break;
}
}
}
2.在支付页面
导入#import "WXApi.h",#import "WXApiObject.h",注意代理<WXApiDelegate>
在微信支付的地方调用,所需参数有服务器提供
PayReq *request = [[PayReq alloc]init];
//商家id
request.partnerId = MCH_id;
request.partnerId = self.payDic[@"partnerid"];
//订单id
request.prepayId = self.payDic[@"prepayid"];
//扩展字段(官方文档:暂时填写固定值)
request.package = @"Sign=WXPay";
//随机字符串 noncestr
request.nonceStr = self.payDic[@"noncestr"];
//时间戳
request.timeStamp = [self.payDic[@"timestamp"] intValue];
//
//sign参数(很经常出现的问题:就是调起支付到微信那边只出现一个确定按钮,单击确认按钮直接返回到app,出现这个问题100%是sign参数的问题)
//参数依次是: appid_key、partnerid_key、prepayid_key、固定值Sign=WXPay、预支付的随机数(跟上面得到预支付订单的随机数要一致)、支付时间(秒)
// request.sign = self.payDic[@"sign"];
request.sign = self.payDic[@"sign"];
NSLog(@"sign是%@",request.sign);
//调用微信支付
[WXApi sendReq:request];
不管是否支付,都会向服务器返回一条信息在AppDelegate.m微信代理方法中可详细查看
回调中errCode值列表:
名称 | 描述 | 解决方案 |
---|---|---|
0 | 成功 | 展示成功页面 |
-1 | 错误 | 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。 |
-2 | 用户取消 | 无需处理。发生场景:用户不支付了,点击取消,返回APP。 |
四.支付流程解析
商户系统和微信支付系统主要交互说明:
步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。
步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。参见【统一下单API】。
步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay
步骤4:商户APP调起微信支付。api参见本章节【app端开发步骤说明】
步骤5:商户后台接收支付通知。api参见【支付结果通知API】
步骤6:商户后台查询支付结果。,api参见【查询订单API】
交互时序图