iOS:APP 支付-微信支付、支付宝支付

当前主流 APP 内购支付方式为微信支付、支付宝支付,结合项目对两类支付做简单总结。

一、微信支付流程

微信支付(官方):
签名算法:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=4_3
APP 开发步骤:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
API 列表:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1#

微信支付流程图

1.引入支付 SDK,完成相关配置

APP 开发步骤:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
资源中心:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319164&lang=zh_CN

2.APP 内购支付流程

2.1 APP 商品下单

商品下单需先调用后端接口

  • 1.验证用户 token 接口
  • 2.请求后端接口,返回微信 prepayid

2.2 调起支付

  • 1.制作签名(也可以服务器端制作签名)
    微信需要二次签名
  • 2.调起支付接口
-(void)signWXPay:(NSString *)prepayid{
    payRequsestHandler *req = [[payRequsestHandler alloc] init];
    [req init:APP_ID mch_id:MCH_ID];
    //设置密钥
    [req setKey:PARTNER_ID];
    
    NSMutableDictionary *signParams = [NSMutableDictionary dictionary];
    [signParams setObject: APP_ID        forKey:@"appid"];
    
    NSString  *time_stamp, *nonce_str;
    time_t now;
    time(&now);
    time_stamp  = [NSString stringWithFormat:@"%ld", now];
    nonce_str = [WXUtil md5:time_stamp];
    
    [signParams setObject: nonce_str   forKey:@"noncestr"];
    [signParams setObject: @"Sign=WXPay"      forKey:@"package"];
    [signParams setObject: MCH_ID        forKey:@"partnerid"];
    [signParams setObject: time_stamp   forKey:@"timestamp"];
    [signParams setObject: prepayid     forKey:@"prepayid"];

    //生成签名
    NSString *sign  = [req createMd5Sign:signParams];
    
    //调起微信支付https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_12&index=2
    if (sign != nil) {
        PayReq* req1             = [[PayReq alloc] init];
        req1.openID              = APP_ID;
        req1.partnerId           = MCH_ID;
        req1.prepayId            = prepayid;
        req1.nonceStr            = nonce_str;
        req1.timeStamp           = time_stamp.intValue;
        req1.package             = @"Sign=WXPay";
        req1.sign                = sign;
        [WXApi sendReq:req1];
    }
}

2.3 处理回调

-(void)onResp:(BaseResp *)resp
{
#pragma mark 微信分享返回resp是SendMessageToWXResp类型
    if ([resp isKindOfClass:[SendAuthResp class]]) {
        SendAuthResp *aresp = (SendAuthResp *)resp;
        if (aresp.errCode == 0)
        {
        }else if (aresp.errCode == -4){
            //   [self messageShow:@"用户拒绝"];
        }else if (aresp.errCode == -2){
            //  [self messageShow:@"用户取消"];
        }
    }

    if([resp isKindOfClass:[PayResp class]]){
        //支付返回结果,实际支付结果需要去微信服务器端查询
        switch (resp.errCode) {
            case WXSuccess:
            {
            #支付成功-相关处理代码
            }
                break;
            default:
                if (resp.errCode == -4){
                    //[self messageShow:@"用户拒绝"];
                }else if (resp.errCode == -2){
                    // [self messageShow:@"用户取消"];
                }
                #支付失败-相关处理代码
                break;
        }
    }
}

二、支付宝支付

支付宝支付(官方):
APP 支付介绍:https://docs.open.alipay.com/204
iOS 集成流程:https://docs.open.alipay.com/204/105295/
参数说明:https://docs.open.alipay.com/204/105465/
签名专区:https://docs.open.alipay.com/291/
API 列表:https://docs.open.alipay.com/api/

支付处理体系

接入流程

1.引入支付 SDK,完成相关配置

APP 开发步骤:https://docs.open.alipay.com/204/105295/
资源中心:https://docs.open.alipay.com/54/104509/

2.APP 内购支付流程

2.1 APP 商品下单

商品下单需先调用后端接口

1.验证用户 token 接口
2.请求后端接口,返回支付宝签名(也可以 APP 做签名)
签名专区:https://docs.open.alipay.com/291/

签名返回示例:
请求参数说明:https://docs.open.alipay.com/204/105465/

charset=utf-8
&biz_content=%7B%2timeout_express%2%2230m%22%2Cproduct_code%22%3AQUICK_MSECURITY_PAY%2C%22total_amount%8A%A1%E8%B4%B5%E5%AE%BE%E5body%22%3A%22%E9%99%E8%85%BE%E4%B8%93%E4%BA%AB%22%2C%22out_trade_no%22%3A%22Z******%22%2C%22passback_params%22%3A%222
&method=alipay.****.app.pay
&notify_url=http%3A%2F%2Fletapi.*******.net%2FretrunPay%2Fali
&app_id=201****890181
&sign_type=RSA2
&version=1.0
&timestamp=****+11%3A52%3A18
&sign=ShkofgVliErCyPGXdmW%2BOcdjQPBSILSigZzLhy3jzj6dQZcQEqsOMvsSMmOQ0lWK3YzlrcnWMQmY71%2Fo3Es8icbNtkRaQAx8%2FjwANDzf50x0bD5AEFcGFDX4icaSKs%2BGk5VGhYbiZP6VeW8cYaWE8Gyg3A9fGbufN1yWA8uB5SrQaBo9EeieI%2Bj%2BqPY4CVtoP9acOvr2HPrR2DKmqLNO%2FSjmWPiVqxkg%3D%3D****;
2.2 调起支付

返回参数说明:https://docs.open.alipay.com/204/105301/

-(void)Alipay:(NSString *)orderString{
    [[AlipaySDK defaultService] payOrder:orderString fromScheme:@"alisdk****" callback:^(NSDictionary *resultDic) {
        NSLog(@"==注意这里是支付宝返回结果=====%@",resultDic);
        NSNumber *restNum = [resultDic objectForKey:@"resultStatus"];
        if ([restNum integerValue] == 9000) {
            [[NSNotificationCenter defaultCenter] postNotificationName:@"paySuccess" object:nil];
        } else{
            [[NSNotificationCenter defaultCenter] postNotificationName:@"payFailure" object:nil];
        }
    }];
}
resultStatus 结果码
2.3支付回调
#pragma mark - 支付宝支付回调
-(void)aliPay:(NSURL *)url{
    [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
        NSNumber *restNum = [resultDic objectForKey:@"resultStatus"];
        if ([restNum integerValue] == 9000) {
            //支付成功处理代码
        }else{
            //支付失败处理代码
        }
    }];
}

其他

如果项目还引入了友盟分享的话还需要在代理方法里设置。

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    NSLog(@"%@", url.host);
    if ([url.host isEqualToString:@"safepay"]){//支付宝支付
        [self aliPay:url];
    }else if ([url.host isEqualToString:@"pay"]) {//微信支付
        return [WXApi handleOpenURL:url delegate:self];
    }else{
        //6.3的新的API调用,是为了兼容国外平台(例如:新版facebookSDK,VK等)的调用[如果用6.2的api调用会没有回调],对国内平台没有影响
        BOOL result = [[UMSocialManager defaultManager] handleOpenURL:url sourceApplication:sourceApplication annotation:annotation];
        if (!result) {
            // 其他如支付等SDK的回调
        }
        return result;
    }
    return YES;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容

  • 支付流程官方文档:https://docs.open.alipay.com/204/105297/ 官方文档提供的...
    追沐阅读 1,731评论 0 4
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,028评论 25 707
  • 去年的雪 静静地 慢慢地 飘落在昏黄而柔和的 路灯灯光里 有些调皮的 支棱在我 毛茸茸的黑色的袖口上 像碎裂的镜屑...
    代小鱼儿阅读 292评论 0 0
  • CountDownLatch中count down是倒数的意思,latch则是门闩的含义。整体含义可以理解为倒数的...
    charming_coder阅读 96,677评论 24 86