前言:下面为各位看客介绍微信支付的开发流程细节,图文全方位解析,解决下我遇见的种种坑.......
老规矩嘛,动手之前最好看一下微信支付官方文档吧!虽然这货文档意义并没有帮助到多大的卵用。
第一步
申请开通微信开放平台帐号(这个是做微信分享,登陆等等都需要开通的就不BB了,链接:微信开放平台),获取AppID和AppSecret。
如图:如果微信支付这个能力获得,红色圈部分就会变成已获得,这属性名取得也是萌萌哒。
第二步
到了这里你应该进入到这个地方:微信支付|商户平台,没错,进入了另外一个网站,就是这么坑B,楼主在这里被坑过一次.......这里面其实也没啥东西,注意一个地方就好。
第三步
下载官方demo,把下图这几个货导入到自己的工程,怎么导入不用说明了吧....
最好看看read_me.txt文档总归没有坏处的嘛
第四步
在AppDelegate里的didFinishLaunchingWithOptions方法里添加
1 [WXApi registerApp:AppID withDescription:@"一只帅B程序员"];
2 在Info->URL Types里面添加AppID
3好,到了我们的重要步骤,重要步骤,重要步骤找到官方demo调支付的方法,如下图:
各位看客可以进入到jumpToBizPay类方法看看。一看就知道其实核心代码就这部份:
//调起微信支付
NSMutableString *stamp = [dict objectForKey:@"timestamp"];
PayReq* req = [[PayReq alloc] init];
req.partnerId = [dict objectForKey:@"partnerid"]; //商家向财付通申请的商家id
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];
注意,楼主是这样做的:
让服务器把上面几个参数打包发给你,把相应数据转成模型或者字典啥的,怎么方便怎么搞,通过这个类方法传过去,这样做的好处:
1.安全性高
2.数据出错方便查找
3.移动端基本原则,尽量将少移动端的压力和处理量
好了,微信支付也就搞定了,下面来看看这过程中会有哪些坑。
常见坑
1 自己看看AppID是不是和数据库返回回来的AppID一样,有次楼主就SB的少copy了一位。。。。
2 nonceStr这个随机串其实就是服务器给你,你不能控制,所以没啥注意的。
3 package = @"Sign=WXPay" 看看服务器传回来的是不是这样的,有可能被编译成了各种奇特的符号,sign的确需要大写,不像之前有些帖子说的要小写。
4 timeStamp这个时间戳,求注意
这个不是NSString类型啊,服务器传回来的时间戳可以拿到去时间戳转换工具里面去转换来看看,和当前时间是否一样,如果不一样那么很有可能就是你写成NSString类型了。
5 如果你app同时使用了友盟分享(含微信分享)和微信支付。如果你没有处理好这个两个SDK register的顺序,那就很不幸,也会出现这种情况。 (如何出现这种情况,请看我的测试步骤:1、杀掉微信进程、2、删除自己开发的app、3、重新同步自己的app到设备,点击微信支付) 两者register的顺序:如果是先调用微信registerApp、然后调用友盟的 [UMSocialWechatHandler setWXAppId:WXAppID appSecret:[NSString stringWithBundleNameForKey:@"WXAppSecret"] url:url] ,然后按照我测试的步骤,应该就会出现。 解决办法:改变两者的register步骤。先调用友盟,然后调用微信。
6 如果上面的都验证过了没错误,那么我遇见的最坑的地方了,就是sing验签,这厮需要传几个字段进去,是要有顺序的,是要注意顺序的,必须要注意顺序
总结:
我在整个做支付过程中,没遇见大的问题,如果连微信支付界面都没调起来,肯定是iOS开发这本的问题,如果能调起来界面,出现一个确定界面,百分之80都是那几个字段出了问题....希望这篇问题对大家开发微信支付有一定的帮助吧!!!!!