美文网首页
iOS支付三部曲之集成微信支付

iOS支付三部曲之集成微信支付

作者: 骑马纵天下 | 来源:发表于2018-11-14 12:18 被阅读48次
    微信支付

    一. 微信支付步骤

    1. 用户进入商户APP,选择商品下单、确认购买,进入支付环节。商户服务后台生成支付订单,签名后将数据传输到APP端。
    2. 用户点击后发起支付操作,进入到微信界面,调起微信支付,出现确认支付界面。
    3. 用户确认收款方和金额,点击立即支付后出现输入密码界面,可选择零钱或银行卡支付。
    4. 输入正确密码后,支付完成,用户端微信出现支付详情页面。
    5. 回跳到商户APP中,商户APP根据支付结果个性化展示订单处理结果。
    
    

    二. 微信支付流程

    下图是微信开发者文档给的流程图

    微信支付流程图

    流程图看着繁琐其实具体就三步:

    1. app接入微信支付SDK,选中商品支付前调用后台给的接口接收调用微信支付需要的参数如tradeToken、orderInfo等。需要注意的是一般后台给的string字符串需要转成json。
    2. 拿到参数后调用微信支付API。
    3. 支付过后一般微信会有支付结果返回,但是安全起见让后台去验证支付是否成功。
      流程大概是上面三个步骤

    三. 开发流程

    微信支付开发者文档

    1. 集成微信支付SDK SDK下载地址
    • 手动集成
    sdk


    将SDK拖到项目中点击项目选中Build Phases > Link Binary With Libraries 添加依赖库。

    依赖库
    • 过CocoaPods集成

    在工程的Podfile里面添加以下代码:

    pod 'WechatOpenSDK'
    
    

    保存并执行pod install。

    2. 设置URL Types

    选择你的工程设置项,选中“TARGETS”一栏,在“info”标签栏的“URL Types“添加“URL scheme”为你所注册的应用程序id

    URL scheme


    Xcode设置URL scheme

    3. 添加代码
    • AppDelegate
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        [WXApi registerApp:@"wx12312321312312"];//注册appid
    }
    - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
        return  [WXApi handleOpenURL:url delegate:[CdWeChatAPIManager sharedCdWeChatAPIManager]];
    }
    
    // 配置系统回调接口
    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
    {
        BOOL result = [UMSocialSnsService handleOpenURL:url];
    
        if (result == FALSE) {
            //调用其他SDK,例如支付宝SDK等
            if ([url.host isEqualToString:@"safepay"]) {
                //跳转支付宝钱包进行支付,处理支付结果
                [[AlipaySDK defaultService]processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
                    [kNotificationCenter postNotificationName:kAlibabaPaymentStatus object:resultDic];//发起通知处理支付结果
                }];
                return YES;
            }
    
            return [WXApi handleOpenURL:url delegate:[CdWeChatAPIManager sharedCdWeChatAPIManager]];
    
        }
    
        return result;
    }
    // NOTE: 9.0以后使用新API接口
    - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
    {
        BOOL result = [UMSocialSnsService handleOpenURL:url];
        if (result == false) {
            if ([url.host isEqualToString:@"safepay"]) {
                //跳转支付宝钱包进行支付,处理支付结果
                [[AlipaySDK defaultService]processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
                    [kNotificationCenter postNotificationName:kAlibabaPaymentStatus object:resultDic];//发起通知处理支付结果
                }];
                return YES;
            }
            return [WXApi handleOpenURL:url delegate:[CdWeChatAPIManager sharedCdWeChatAPIManager]];
        }
        return result;
    }
    
    

    delegate的类根据自己的需求可以自定义,目前我们项目时这样写的。获取到支付回调后请求后台验证接口,验证支付是否成功。需要注意的是设置过代理后需要遵守微信协议WXApiDelegate
    关于集成支付宝在下篇文章传送门

    • 回调单例类CdWeChatAPIManager
    .h
    @protocol CdWeChatAPIManagerDelegate <NSObject>
    
    @optional
    
    - (void)managerDidRecvAuthBaseResp:(BaseResp *)response;
    
    @end
    
    @interface CdWeChatAPIManager : NSObject <WXApiDelegate>
    
    @property (nonatomic, weak) id<CdWeChatAPIManagerDelegate> delegate;
    
    singleton_interface(CdWeChatAPIManager);
    
    @end
    
    @implementation CdWeChatAPIManager
    
    singleton_implementation(CdWeChatAPIManager);
    
    #pragma mark - WXApiDelegate
    - (void)onResp:(BaseResp *)resp {
        if([resp isKindOfClass:[PayResp class]]){
            if (self.delegate && [self.delegate respondsToSelector:@selector(managerDidRecvAuthBaseResp:)]) {
                [self.delegate managerDidRecvAuthBaseResp:resp];
            }
        }
    
    }
    
    - (void)onReq:(BaseReq *)req {
    
    }
    @end
    
    
    • 处理微信支付回调结果

    在需要展示的地方遵守协议

    - (void)managerDidRecvAuthBaseResp:(BaseResp *)response{
        [[CdPaymentCenter sharedCdPaymentCenter].hud hide:YES];
        if (response.errCode == 0) {
          //调用后台验证支付是否成功接口 验证完成后微信支付基本算完成了。
        }else if (response.errCode == -1){
            [self paymentFailure:@"支付失败"];
        }else if(response.errCode  == -2){
            [self paymentFailure:@"支付取消"];
        }
    }
    
    

    回调中errCode值列表:

    名称 描述 解决方案
    0 成功 展示成功页面
    -1 错误 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
    -2 用户取消 无需处理。发生场景:用户不支付了,点击取消,返回APP。

    写在最后

    • 关于掉单问题目前我们的解决办法是每调起支付会创建一个事件放到数据库中,如果正常情况支付完成了会把数据删了如果发生断网,关机等情况,有网时或者开机。会检测数据库是否有未完成的订单去后台查询支付是否完成,商品是否购买成功。
    • 关于签名问题最好是让后台去做不要APP端完成,不然风险太大。
    • 关于调微信支付的参数:签名APPID等是根据某个字符分开的,取到后需要自己拼。
    • 关于注册APPID问题产品或者运营一般都弄好了如果自己申请网站申请后需要微信审核。

    相关文章

      网友评论

          本文标题:iOS支付三部曲之集成微信支付

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