iOS-微信支付功能实现

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

  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];
        //------------------------
    }
    
}

其实移动端实现起来还是很简单的, 至于各种验证还是后台辛苦下了😂

如果这篇文章对您有些许帮助 请给我点个心吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容

  • 实现支付宝支付的准备工作: 1.向支付宝签约,成为支付宝的商户 签约完成后,支付宝会提供一些必要的数据给我们 商户...
    Anson杨春安阅读 8,190评论 0 6
  • 前言:本篇文章目的在于梳理知识,巩固思想,学习总结。有什么好的建议,都可以留言。互相促进!总观,微信支付,也没心思...
    麦穗0615阅读 10,027评论 8 70
  • 在被支付宝、银联坑过之后,发现其实微信支付的集成并没有想象中的那么困难,像支付宝那样简单地调用个方法就行,重要的难...
    petry阅读 702评论 2 2
  • 自己总结的微信支付宝支付流程和注意点: 准备工作: 需要公司的营业执照,税务信息,等老板的身份证信息等,我记得,用...
    Www刘阅读 18,558评论 2 50
  • 银联支付,支付宝支付,微信支付的三大总结,之前也有写过两篇。 微信支付,支付宝支付,银联支付——三大支付总结: h...
    LucasAdam阅读 4,917评论 2 23