美文网首页
iOS-微信支付功能实现

iOS-微信支付功能实现

作者: 树根曰 | 来源:发表于2016-12-26 21:14 被阅读0次

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

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

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

    第一步: 下载微信 SDK

    微信 SDK 下载
    在这里下载微信 SDK

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

    read_me
    1. 将 SDK 拖入工程
    2. 导入一下框架和链接库:
    SystemConfiguration.framework, 
    libz.dylib, libsqlite3.0.dylib, 
    libc++.dylib, Security.framework, 
    CoreTelephony.framework, 
    CFNetwork.framework
    

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

    1. 将微信支付要用到的APPID设置为URL Schemes
    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;
    }
    

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


    #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-微信支付功能实现

          本文链接:https://www.haomeiwen.com/subject/gdxsvttx.html