APP接入微信支付流程

最近的一个项目涉及到支付,这里就先说一下微信支付,像微信开发者申请,APP申请相信大家都非常熟悉,设计到支付,还需要申请支付功能,按照微信所要求的提供相关材料即可,接下来就等待审核结果吧。

微信支付流程及注意事项:

一.所需导入的类库

1.导入微信SDK

直接将微信SDK拉入工程即可,若使用了其他第三方如友盟,则可以忽略,因为友盟已经包含微信支付所需的相关文件,如下图

APP接入微信支付流程

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

交互时序图

APP接入微信支付流程