iOS-微信支付功能实现

悠闲时光, 顺便将开发过程中, 经常使用到的一些功能, 记录分享出来,比如支付!
本想写一篇银联支付,不过看了之前转载过一篇关于银联支付的文章写得很详细,我就不再重复了, 有兴趣的童鞋可以去看一下; 戳这里
首先介绍一下微信支付的实现流程:

  1. 注册微信开放平台,创建应用获取appid,appSecret,申请支付功能(需要花费300大洋进行开发者资质认证),申请成功之后会返回一些参数.
  1. 下载微信支付sdk
  2. 客户端请求订单,后台与微信后台交互,返回给客户端支付参数
  3. 调用微信客户端,由微信客户端和微信服务器打交道;
  4. 客户端和服务端都会收到支付结果;(前台消息不可靠,我们需要去后台验证,如果后台没有收到支付通知,后台去微信服务器验证然后将结果返回给客户端)

开发步骤
在微信开放平台注册应用, 并开通支付功能之后(期间各种认证, 确认信息等操作按照流程走就可以, 在此省略)

第一步: 下载微信 SDK

iOS-微信支付功能实现_第1张图片
微信 SDK 下载

在这里 下载微信 SDK

第二步: 集成 SDK
当下载 SDK 之后, 会看到其中有一个** read_me.txt ** 文件, 其实里面就是讲了最近几个版本的更新中解决的问题,以及使用该SDK的注意事项,所以这个 read_me 文件是很重要的。

iOS-微信支付功能实现_第2张图片
read_me

  1. 将 SDK 拖入工程
  2. 导入一下框架和链接库:
SystemConfiguration.framework, 
libz.dylib, libsqlite3.0.dylib, 
libc++.dylib, Security.framework, 
CoreTelephony.framework, 
CFNetwork.framework
iOS-微信支付功能实现_第3张图片

注: 如果是XCode 7之前,估计还需要手动导入Foundation.framework、UIKit.framework等框架;

  1. 将微信支付要用到的APPID设置为URL Schemes
iOS-微信支付功能实现_第4张图片
2B2A9042-0FDD-4C5B-AE88-20EEBE749F8A.png

第三步: 就是写代码了

  1. 注册APPID
    商户APP工程中引入微信lib库和头文件,调用API前,需要先向微信注册您的APPID,代码如下:
#pragma mark 微信支付
- (void)wxPay {
    /**
     *  微信支付
     *  APPID: 
     */
    
    //向微信注册
    BOOL isok = [WXApi registerApp:@"项目 APPID" withDescription:@"项目名称"];
    if (isOk) {
        
        TY_Log(@"注册微信成功");
    }else{
        
        TY_Log(@"注册微信失败");
    }
}
  1. 调起支付
    商户服务器生成支付订单,先调用【统一下单API】生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。以下是调起微信支付的关键代码:
    现在我们只需要在控制器上添加一个button, 名字改成微信支付就可以了
    button事件:
- (void)wxPayBtnClick:(UIButton *)sender {
    
    if (![WXApi isWXAppInstalled]){  // 是否安装了微信
        
        UIAlertView *alter = [[UIAlertView alloc] initWithTitle:@"提示" message:@"没有安装微信" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alter show];
    } else if (![WXApi isWXAppSupportApi]){ // 是否支持微信支付
        
        UIAlertView *alter = [[UIAlertView alloc] initWithTitle:@"提示" message:@"不支持微信支付" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alter show];
        
    }else{  //已安装微信, 进行支付
        
        [self WXPay];
    }
    
}
#pragma mark 微信支付方法
- (void)WXPay{
    
//将微信支付所需参数信息,传给服务器
    [BusinessEngine getWXPayParameteFlowCode:self.flowCode Body:self.storeName Price:self.orderValue Completion:^(NSDictionary *aDic) {
        
        //需要创建这个支付对象
        PayReq* req= [[PayReq alloc]init];
        //由用户微信号和AppID组成的唯一标识,用于校验微信用户
        //req.openID = [aDic objectForKey:@"appid"];
        
        // 商家id,在注册的时候给的
        req.partnerId = [aDic objectForKey:@"partnerid"];
        // 预支付订单这个是后台跟微信服务器交互后,微信服务器传给你们服务器的,你们服务器再传给你
        req.prepayId  = [aDic objectForKey:@"prepayid"];
        // 根据财付通文档填写的数据和签名
        //这个比较特殊,是固定的,只能是即req.package = Sign=WXPay
        req.package = @"Sign=WXPay";
        // 随机编码,为了防止重复的,在后台生成
        req.nonceStr = [aDic objectForKey:@"noncestr"];
        // 这个是时间戳,也是在后台生成的,为了验证支付的
        NSString * stamp = [aDic objectForKey:@"timestamp"];
        req.timeStamp = stamp.intValue;
        // 这个签名也是后台做的
        req.sign = [aDic objectForKey:@"sign"];
        //日志输出
        //NSLog(@"appid=%@\npartid=%@\nprepayid=%@\nnoncestr=%@\ntimestamp=%ld\nsign=%@",[aDic objectForKey:@"appid"],req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.sign );
        //发送请求到微信,等待微信返回onResp
        [WXApi sendReq:req];
    }];
    
}

3 . 支付结果回调
按照微信SDKSample,在类实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。
注意:
一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。
这是最后一步了, 我们在支付页面支付完成以后呢要知道支付结果, 怎么做呢?

首先, 在 AppDelegate.m 里面实现该方法

#pragma mark 跳转支付宝, 微信 进行支付,处理支付结果
- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
    
    NSString *urlStr = [NSString stringWithFormat:@"%@",url];
    
    if ([url.host isEqualToString:@"safepay"]) {  //判断支付宝回调
        //跳转支付宝钱包进行支付,处理支付结果
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
            //TYLLog(@"result = %@",resultDic);
            //TYLLog(@"result", resultDic)
        }];
        
    }else if ([sourceApplication isEqualToString:@"com.tencent.xin"] && [urlStr containsString:@"pay"]){  //判断微信回调

        TY_Log(@"跳转微信支付处理支付方式结果");
        return [WXApi handleOpenURL:url delegate:self];
        
    }
    
    return YES;
}

接下来我们需要遵守下协议


iOS-微信支付功能实现_第5张图片
#pragma mark 微信支付回调
-(void)onResp:(BaseResp*)resp{
    //NSString * strMsg = [NSString stringWithFormat:@"errorCode: %d",resp.errCode];
    
    //TY_Log(@"微信 = strMsg:", strMsg)
    
    //NSString * errStr = [NSString stringWithFormat:@"errStr: %@",resp.errStr];
    
    //TY_Log(@"微信 = errStr:", errStr)
    
    NSString *strTitle;
    if ([resp isKindOfClass:[SendMessageToWXResp class]]) {
        strTitle = [NSString stringWithFormat:@"发送媒体消息结果"];
    }
    
    NSString * wxPayResult;
    if ([resp isKindOfClass:[PayResp class]]) {
        
        strTitle = [NSString stringWithFormat:@"支付结果"];
        
        switch (resp.errCode) {
            case WXSuccess:
            {
                TYLLog(@"支付结果: 成功!");
                wxPayResult = @"success";
            }
                break;
            case WXErrCodeCommon:
            { //签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等
                
                TYLLog(@"支付结果: 失败!");
                wxPayResult = @"faile";
            }
                break;
            case WXErrCodeUserCancel:
            { //
                TYLLog(@"用户点击取消并返回");
                wxPayResult = @"cancel";
            }
                break;
            case WXErrCodeSentFail:
            { //发送失败
                TYLLog(@"发送失败");
                wxPayResult = @"faile";
            }
                break;
            case WXErrCodeUnsupport:
            { //微信不支持
                TYLLog(@"微信不支持");
                wxPayResult = @"faile";
            }
                break;
            case WXErrCodeAuthDeny:
            { //授权失败
                TYLLog(@"授权失败");
                wxPayResult = @"faile";
            }
                break;
            default:
                break;
        }
        
        //发出通知 从微信回调回来之后,发一个通知,让请求支付的页面接收消息,并且展示支付结果,或者进行一些自定义的展示或者跳转
        NSNotification * notification = [NSNotification notificationWithName:@"WXPay" object:wxPayResult];
        [[NSNotificationCenter defaultCenter] postNotification:notification];
        //------------------------
    }
    
}

其实移动端实现起来还是很简单的, 至于各种验证还是后台辛苦下了

如果这篇文章对您有些许帮助 请给我点个心吧。

你可能感兴趣的:(iOS-微信支付功能实现)