微信支付

分享一下微信支付的接入

调起微信支付的整个流程是:

一、在appDelegate中配置,并写好方法接受微信返回信息,

二、调用后台接口(自定义)与微信交互,微信返回必要参数,其中最主要一个参数是prepay_id

三、使用appid、noncestr(下面有详细生成方法)package(目前为固定值,直接给@"Sign=WXPay")、partnerid(就是mchId)timestamp(时间戳)、prepayid生成签名sign

四、将必要参数传给PayReq对象

五、最后,使用WXApi的sendReq方法吊起微信。

下面开始贴方法:

准备工作:

1.到微信开放平台,申请开通支付功能(唯一注意,bundleId需与工程一致),在财付通回馈的邮箱中获取以下信息(注:以下信息已修改,不可直接复制使用)

  APP_ID @"wxf120b5260432545"                                  //APPID
  APP_SECRET @"998d17563f0d6d0181b90ff543656ygrs"              //appsecret
  MCH_ID @"1269999401"                                        //商户号
  PARTNER_ID @"xbM5MBCVOj2sEAs8KrMfwla4djpcQKuvG9"            //商户API密钥

2.下载微信支付SDK

3.AppDelegate 可直接复制使用

#import "WXApi.h"
#import "WXApiObject.h"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
        // 1.注册微信
        [WXApi registerApp:WECHAT_APPID withDescription:@"weichatpayblog"];
        return YES;
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
        return [WXApi handleOpenURL:url delegate:self];
}
- (void)onResp:(BaseResp *)resp
{
        NSString *strMsg = [NSString stringWithFormat:@"errcode:%d",resp.errCode];
        NSString *strTitle;
        NSString *strNote;
        if ([resp isKindOfClass:[PayResp class]]) {
              // 支付返回结果,实际支付结果需要去微信服务器端查询
              strTitle = @"支付结果";
        }
        switch (resp.errCode) {
              case WXSuccess:{
                    strMsg = @"支付成功,可以进行洗车";
                    strNote = @"success";
                    break;
              }
              case WXErrCodeUserCancel:{
                    strMsg = @"支付已取消";
                    strNote = @"cancel";
                    break;
              }
              case WXErrCodeSentFail: {
                    strMsg = @"支付失败,请重新支付";
                    strNote = @"fail";
                    break;
              }
              default:{
                    strMsg = @"支付失败";
                    strNote = @"fail"; 
                    break;
              }
        }
        [[NSNotificationCenter defaultCenter] postNotificationName:ORDER_PAY_NOTIFICATION object:strNote];
        [Alert showWithTitle:strMsg];
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
        return [WXApi handleOpenURL:url delegate:self];
}

4.调起支付

  #import "WXApi.h"
  #import "WXApiObject"
  #import "WXUtil.h"
  - (void)clickPayWithWechat
  {
        // 判断客户端是否安装微信/版本是否支持 
        if ([self isWXAppInstalled]) {
              [self updateOrderInfoToWechat];
        }
  }
  - (BOOL)isWXAppInstalled
  {
        // 1.判断是否安装微信
        if (![WXApi isWXAppInstalled]) {
              [Alert showWithTitle:@"您尚未安装\"微信App\",请先安装后再返回支付"];
              return NO;
        }
        // 2.判断微信的版本是否支持最新Api
        if (![WXApi isWXAppSupportApi]) {
              [Alert showWithTitle:@"您微信当前版本不支持此功能,请先升级微信应用"];
              return NO;
        }
        return YES;
  }
  - (void)updateOrderInfoToWechat
  {
         // 调用自己后台接口
         // 返回 prePay_id  
         // wechatModel 为自定义模型 存储微信支付所需参数
        if (wechatModel.prepay_id != nil) {
              DLog(@" %@ ",wechatModel.prepay_id);
              NSString *package, *time_stamp, *nonce_str;
              time_t now;
              time(&now);
              time_stamp = [NSString stringWithFormat:@"%ld",now];
              nonce_str = [WXUtil md5:time_stamp];
              package = @"Sign=WXPay";
              NSMutableDictionary *signParams = [NSMutableDictionary dictionary];
              [signParams setObject:WECHAT_APPID forKey:@"appid"];
              [signParams setObject:nonce_str forKey:@"noncestr"];
              [signParams setObject:package forKey:@"package"];
              [signParams setObject:WECHAT_MCH_ID forKey:@"partnerid"];
              [signParams setObject:time_stamp forKey:@"timestamp"];
              [signParams setObject:wechatModel.prepay_id forKey:@"prepayid"];
              NSString *sign = [self createMd5Sign:signParams];
              [signParams setObject:sign forKey:@"sign"];
              // 这里 调起微信  一个参数也不能少  重要的事 我不想说三遍了,调不起会来看三遍的 哈哈哈....
              PayReq *req = [[PayReq alloc] init];
              req.openID = WECHAT_APPID;
              req.partnerId = WECHAT_MCH_ID;
              req.prepayId = wechatModel.prepay_id;
              req.nonceStr = nonce_str;
              req.timeStamp = time_stamp.intValue;
              req.package = package;
              req.sign = sign;
              [WXApi sendReq:req];
        }    
  }
  -(NSString*) createMd5Sign:(NSMutableDictionary*)dict
  {
        NSMutableString *contentString  =[NSMutableString string];
        NSArray *keys = [dict allKeys];
        //按字母顺序排序
        NSArray *sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
              return [obj1 compare:obj2 options:NSNumericSearch];
        }];
        //拼接字符串
        for (NSString *categoryId in sortedArray) {
              if (![[dict objectForKey:categoryId] isEqualToString:@""] && ![categoryId isEqualToString:@"sign"] && ![categoryId isEqualToString:@"key"])
        {
              [contentString appendFormat:@"%@=%@&", categoryId, [dict objectForKey:categoryId]];
        }
    
        }
        //添加key字段
        [contentString appendFormat:@"key=%@", wechatModel.key];
        //得到MD5 sign签名
        NSString *md5Sign =[WXUtil md5:contentString];
        //    //输出Debug Info
        //    [debugInfo appendFormat:@"MD5签名字符串:\n%@\n\n",contentString];
         return md5Sign;
  }

至此 应该已经成功调起微信支付了,在这个类当中,添加观察者,对跳转后的信息处理

将状态信息传给自己的后台 就结束了

过程中需要注意的是

1.传个PayReq对象的参数不能少

2.如果工程中使用了友盟,会出现冲突,因为友盟的包里包含了微信sdk,删掉友盟里重复即可,这里网上有相关资料,不再赘述

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

推荐阅读更多精彩内容

  • 前言:本篇文章目的在于梳理知识,巩固思想,学习总结。有什么好的建议,都可以留言。互相促进!总观,微信支付,也没心思...
    麦穗0615阅读 10,038评论 8 70
  • 实现支付宝支付的准备工作: 1.向支付宝签约,成为支付宝的商户 签约完成后,支付宝会提供一些必要的数据给我们 商户...
    Anson杨春安阅读 8,197评论 0 6
  • 自己总结的微信支付宝支付流程和注意点: 准备工作: 需要公司的营业执照,税务信息,等老板的身份证信息等,我记得,用...
    Www刘阅读 18,562评论 2 50
  • 在被支付宝、银联坑过之后,发现其实微信支付的集成并没有想象中的那么困难,像支付宝那样简单地调用个方法就行,重要的难...
    petry阅读 702评论 2 2
  • 正当我快要入睡时,一个简友在我的参赛作品《遗产之花盛开时》留言《万元征文大赛,我质疑评委为何得奖,没想到评委竟然这...
    苏宇城阅读 1,608评论 47 61