美文网首页iOS干货iOS学无止境
iOS常用的第三方支付(微信支付,支付宝支付)

iOS常用的第三方支付(微信支付,支付宝支付)

作者: Jack_Baiyx | 来源:发表于2017-02-23 12:06 被阅读622次

    微信支付

    商家系统和微信支付系统主要交互说明:

    步骤1:用户在商品APP选择商品,提交订单,选择微信支付.
    步骤2:商户后台收到用户支付单,调用微信支付统一下单接口.
    步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP.参与签名的字段名为appid,partnerId,prepayid,nonceStr,timestamp,package.注意:package的值为Sign=WXPay.
    步骤4:商户APP调起微信支付.
    步骤5:商户后台接受支付通知.
    步骤6:商户后台查询支付结果

    iOS端开发步骤说明

    项目设置APPID

    商户在微信开发平台申请开发APP应用后,微信开发平台会生成APP的唯一标识,APPID.在Xcode中打开项目,设置项目属性中的URL Sechemes为您的APPID.并在info.plist中设置白名单.

    注册APPID

    具体配置说明请参考微信支付官方文档
    商户APP工程中引入微信lib库和头文件,调用API前,需要先向微信注册您的APPID,代码如下:

    [WXApi registerApp:@"wxd930ea5d5a258f4f" withDescription:@"demo 2.0"];
    

    调起支付

    商户服务器端生成支付订单,先调用生成预订单,获取到prepay_id后将参数再次签名传输给APP发起支付.以下是调起微信支付的关键代码;

    PayReq *request = [[[PayReq alloc] init] autorelease];
    request.partnerId = @"10000100";
    request.prepayId= @"1101000000140415649af9fc314aa427";
    request.package = @"Sign=WXPay";
    request.nonceStr= @"a462b76e7436e98e0ed6e13c64b4fd1c";
    request.timeStamp= @"1397527777";
    request.sign= @"582282D72DD2B03AD892830965F428CB16E7A256";
    [WXApi sendReq:request];
    

    支付结果回调

    在类实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意 一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。代码示例如下:
    首先在Appdelegate.m里面实现该方法

    -(BOOL)application:(UIApplication *)app openURL:(NSURL *)url option:(NSDictionary <NSString  *id> *)options 
    {
    /**处理微信通过URL启动app是传递的数据
      *需要在 application:openURL:souceApplication:annotation或者application:handleOpenURL中调用.
      *@param url 微信启动第三方应用时传递过来的URL
      *@param delegate WXAppDelegate对象,用来接收微信触发的消息
      *@return 成功返回YES, 失败返回NO
    */
    return [WXApi handleOpenURL:url delegate:self];
    }
    

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

    遵守WXapiDelegate协议.png

    最后一步就是等待支付结果出来以后回调一个函数了.

    /**发送一个sendReq后,收到微信的回应
       *收到一个来自微信的处理结果,调用一次sendReq后会收到OnResp;
       *可能收到的处理结果有SendMessageToWXResp,SendAuthResp等
       *@param resp具体的回应内容
    */
     -(void)onResp:(BaseResp*)resp{
                  if ([respisKindOfClass:[PayRespclass]]){
                      PayResp*response=(PayResp*)resp;
                      switch(response.errCode){
                          caseWXSuccess:
                                    //服务器端查询支付通知或查询API返回的结果再提示成功
                                    NSlog(@"支付成功");
                            break;
                            default:
                            NSlog(@"支付失败,retcode=%d",resp.errCode);
                            break;
                      }
                        }
                    } 
    

    支付宝支付

    支付宝支付大致流程:

    a. 公司与支付宝进行签约,获取商户ID(partner)和账号ID(seller)和公钥(privateKey),这些开发中会用到,很重要!
    b. 商户在b.alipay.com中进行签约.
    c. 审核:商户登录py.alipay.com 可在”签约订单”中查看审核进度.
    d. 下载支付宝SDK.
    e. 生成订单,签名加密.
    f. 开始支付,调起支付包客户端或者网页端,然后进行支付,由支付宝与银联系统进行系统进行打交道,并由支付宝处理的结果返回给客服端.
    g. 展示支付结果给客户.

    支付宝支付流程图.png

    上图中的”商户客户端”就是iOS客户端需要做的事情.
    a. 调用支付宝支付接口,发送订单
    b. 处理支付宝返回的支付结果
    注:在调用支付宝支付接口前,我们还需要生成一个订单,订单的生成可以放在客户端也可以放在服务器端,最好是放在服务器端,因为放在服务器端的话,你可以掌握所有的订单,而且也比较安全.

    c.如果对安全性要求不高的做完以上两步支付功能已经完成.但是如果考虑安全性的问题,则需要在生成订单和支付结果的时候做一次安全校验,目前官方校验只支持使用RSA的验签方法,通过签名字符串、签名参数(经过base64解码)及支付宝公钥验证签名。

    客户端集成支付宝SDK流程

    步骤1:启动IDE(开发工具),如Xcode,在官方下载iOS支付宝SDK,解压文件并拷贝导入到项目目录中,添加必要的依赖库.

    添加依赖库有.png

    步骤2:在需要调用AlipaySDK的文件夹中,添加头文件引用

    步骤3:组装请求信息(注:这一步应该在商户服务器端完成,商户服务器端直接将组装和签名后的请求字符串orderString传给客户端,客户端直接调用支付接口传给SDK发起支付请求), Alipay接口主要为商户提供订单支付功能。接口所提供的方法,如下表所示

    支付宝支付功能接口列表.png

    步骤4:配置支付宝客户端返回url处理方法.在Appdelegate中做一下demo业务处理

    步骤5: 当这笔交易被买家支付成功后支付宝收银台上显示该笔交易成功,并提示用户“返回”。此时在APAppDelegate.m的 - (BOOL)application:(UIApplication )application openURL:(NSURL )url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 中调用获取返回数据的代码【iOS9.0以上(包括iOS9.0)需要在 - (BOOL)application:(UIApplication *)app openURL:(NSURL )url options:(NSDictionary<NSString, id> *)options 中执行 】

    -(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{  
        [self alipayUrlAction:url];  
         return YES;  
    }  
      
      
      
    -(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{  
        //有多中支付方式,要用scheme 来进行判断,看是那种途径的url.  
        [self alipayUrlAction:url];  
        return YES;  
    }  
      
    -(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{  
        [self alipayUrlAction:url];  
         return YES;  
    }  
      
    -(void)alipayUrlAction:(NSURL *)url{  
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {  
            if ([[resultDic valueForKey:@"resultStatus"] intValue] == 9000) {  
                if ([_aliDelegate respondsToSelector:@selector(alipydidSuccess)]) {  
                    [_aliDelegate alipydidSuccess];  
                }  
            }else{  
                if ([_aliDelegate respondsToSelector:@selector(alipydidFaile)]) {  
                    [_aliDelegate alipydidFaile];  
                }  
            }  
        }];  
    }  
    

    相关文章

      网友评论

      • 30563c215a38:[_aliDelegate respondsToSelector:@selector(alipydidSuccess)]) {
        [_aliDelegate alipydidSuccess]; 哥们你这个成功点击成功 跳转方法怎么写的啊

      本文标题:iOS常用的第三方支付(微信支付,支付宝支付)

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