iOS ——微信支付

最近项目要求添加一个微信支付的功能,要求是不需要服务端的配合,独立在客户端完成。
开始看官方demo的时候发现客户端只有短短的几行代码便成功了,更关键的是文档中那些参数都解释的含含糊糊。结果花了我好几天的时间才最终弄好。现在细数其辛酸历程。

                    //调起微信支付
                    PayReq* req             = [[[PayReq alloc] init]autorelease];
                    req.partnerId           = [dict objectForKey:@"partnerid"];
                    req.prepayId            = [dict objectForKey:@"prepayid"];
                    req.nonceStr            = [dict objectForKey:@"noncestr"];
                    req.timeStamp           = stamp.intValue;
                    req.package             = [dict objectForKey:@"package"];
                    req.sign                = [dict objectForKey:@"sign"];
                    [WXApi sendReq:req];

这就官方文档中最核心的调出支付的代码,我们所需要做的一切都是获取这六个参数。

首先来一个个的解释这些参数
partnerId :这个就是在你申请通过微信商户资料后发到你邮件的中的一个商户号


106A3038-E2CA-46D0-9AFC-B86DF979D588.png

prepayid : 这个是需要向微信服务器提交申请后返回的一个支付交易会话ID,详细的下面会提到。

nonceStr : 这个是你自己生成的一个随机数。

timeStamp : 这个是你生成的一个时间戳。10位!!!不是13位的那个!

package : 这个目前是一个定死的值 Sign=WXPay。

sign : 这个是自己根据参数生成的一个签名!最坑的就是它了!

现在来一个的说如何得到这些参数值

1、prepayid
这个一般来说是在服务端申请好的,客户端直接获取就行。但是万恶的公司居然要求在客户端弄。
先看官方文档:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=9_1
乍一看无非是向微信的一个接口提交数据,然后就会返回了。
但是这茫茫多的参数中其实隐藏着无数的细节,稍有不慎就返回一个大大失败,然后你就愁的一头包了。
这些参数里面有一个是需要生成一个签名,这个签名也是有官方文档专门介绍的:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=4_3
这个文档中有举一个例子,大概就是说把一些参数按照ASCII的顺序先进行排序然后再拼接上一个key(这个key是你在申请成功商户资料后按照邮件中提示进行设置的,32位)。拼接好后进行MD5转码。看起来很轻松明了吧,但是这里面最大的一个坑就是他这个举例了!这个例子中只有寥寥几个参数,如果你就按照他这个也只是用这几个参数生成签名,那就怎么也获取不到这个prepayid了!实际上,这个签名里面所包含的参数是需要包含你所要提交获取prepayid的所有参数的!
也就是前面给的官方文档中所有表示必须要的参数,当然除了你现在要生成的这个sign。
顺便提一句,这里的提交数据是以XML的形式,解析数据也是XML的格式。
这样就可以顺利的获得prepayid了。

2、nonceStr
这个很简单

NSString * nonce_str = [self md5:[NSString stringWithFormat:@"%d", arc4random() % 10000]];
nonce_str = [nonce_str uppercaseString];

- (NSString *) md5: (NSString *) inPutText
{
    const char *cStr = [inPutText UTF8String];
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5(cStr, strlen(cStr), result);
    
    return [[NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
             result[0], result[1], result[2], result[3],
             result[4], result[5], result[6], result[7],
             result[8], result[9], result[10], result[11],
             result[12], result[13], result[14], result[15]
             ] lowercaseString];
}

其实就是一个随机数,怎么生成随你。有个不得不提的地方,这里的noncestr就是你在第一次生成签名时的那个随机数,不用再次生成了!

3、timeStamp

NSString * timeString = [NSString stringWithFormat:@"%.0f", [[NSDate date] timeIntervalSince1970]];

这个地方需要提示一下

@property (nonatomic, assign) UInt32 timeStamp;

他的类型是这个样的,而你生成的是一个字符串类型的,最后提交的时候需要进行转化的!

4、sign
这里的签名不同于你第一次申请prepayid的签名,这里的生成签名的参数是appid,prepayid,partnerid,timestamp,noncestr,package,这几个排序后再拼接key,最后生成一个sign。

这样一看,其实还是很简答的嘛!果然还是我太蠢了.......好了,如果还是不行,请再看一遍,仔细的看一遍。实在不行,请联系我!

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

推荐阅读更多精彩内容

  • 前言:本篇文章目的在于梳理知识,巩固思想,学习总结。有什么好的建议,都可以留言。互相促进!总观,微信支付,也没心思...
    麦穗0615阅读 10,012评论 8 70
  • 前提是已经创建完应用了在微信的官网上。根据上一篇的微信获得支付能力的步骤,这一篇主要制作微信支付的demo。回顾上...
    阳光的大男孩儿阅读 24,254评论 25 50
  • 看到个不错的微信集成帖子,分享给大家!(因为微信支付也真是够恶心的,TM要配置什么环境都没说,肯定很多新手会被恶心...
    白屏阅读 1,163评论 0 48
  • 一:介绍 项目中要用到支付功能,需要支付宝支付、支付宝网页支付、微信支付、银联支付、Apple_pay,所以打算总...
    Swift社区阅读 10,504评论 5 25
  • 前言:之前听说过微信支付有很多坑,其实没有想象的那么坑,整体感觉很容易上手,按照它的流程来不会有错!PS:官方的流...
    li大鹏阅读 4,752评论 5 41