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

2018-11-14  本文已影响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 添加依赖库。

依赖库

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

pod 'WechatOpenSDK'

保存并执行pod install。

2. 设置URL Types

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

URL scheme


Xcode设置URL scheme

3. 添加代码
- (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
关于集成支付宝在下篇文章传送门

.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。

写在最后

上一篇下一篇

猜你喜欢

热点阅读