iOS微信支付的步骤以及问题描述
来源:互联网 发布:redis怎么存储数据 编辑:程序博客网 时间:2024/06/14 17:59
本博客转自:http://www.jianshu.com/p/22a1ceee4d36
一、微信支付的步骤:
1.在微信开放平台注册。微信开放平台
2.创建一个App应用。(需要填写App的资料,审核一般也得3-5天)
3.获取开发者资质认证。(最少也得一个星期,需要费用300元,一种是公对公转账,另一种是微信支付)
注意:a、在公对公转账的过程中,账户的名称一个字都不要少也不要错,这样才能转账成功,我们曾经就是因为错了一个字,转账过去了但是迟迟不能申请通过,耽误了一个月的时间。后来我们微信转账,速度还是比较快的。
b、在申请退款的过程中,可以打腾讯的客服电话,进行审核,准备好银行流水信息与需要支付的金额。
c、两种方式:一种是官方的腾讯qq进行沟通,然后申请退款;第二种:腾讯公司微信支付电话:0755-86018333
d、微信公众平台电话:0755-83768788
4.创建的App开通“获取支付能力”。
5.下载微信商户平台的证书,并且安装到开发电脑上。微信商户平台 (需要在safari浏览器进行登录,并且下载微信的登录密码的安全插件)
6.配置微信商户平台的密匙。
7.下载官方的支付demo与SDK。
8.植入SDK。
10.后台创建API参数,根据后台的url数据,获得支付。
二、腾讯客服电话:
![](http://upload-images.jianshu.io/upload_images/1025776-911a350b00e3a738.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
前提是已经创建完应用了在微信的官网上。根据上一篇的微信获得支付能力的步骤,这一篇主要制作微信支付的demo。
往往回忆就是痛苦的因为记不住曾经的经历,还是喜欢简单粗暴。
1.微信支付的demo与SDK。网址
2.下载完之后,里面有好多的没用的文件,包括登录,分享,等等。(看到这里好恶心,为啥不单独做一个demo呢,哎,还能不能愉快的玩耍了)。
如下 的文件夹目录的内容:
![](http://upload-images.jianshu.io/upload_images/1025776-5aed95dfb219a8ec.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
demo目录
3.创建一个wxDemo工程。
4.查看微信的官方文档。iOS微信支付文档
5.因为现在 的工程是iOS9 ,所以需要配置网址与白名单。
![](http://upload-images.jianshu.io/upload_images/1025776-702414611d415389.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
配置网址与白名单
6.改变bitcode设置为NO。
![](http://upload-images.jianshu.io/upload_images/1025776-a88acb51835f4676.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
改变bitcode为NO
7.添加URL Types,如下。
![](http://upload-images.jianshu.io/upload_images/1025776-f0420c313097b501.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
添加URL Schemes
8.添加微信SDK到wxDemo里面。
9.添加框架,用来安装应用。iOS文档链接 。需要添加以下库:
SystemConfiguration.framework,
libz.dylib,
libsqlite3.0.dylib,
libc++.dylib
如下图:
![](http://upload-images.jianshu.io/upload_images/1025776-ab6d812b036e587c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
添加依赖库
10.在Appdelegate.m里面添加如下代码:
//注册微信支付
[WXApi registerApp:@"wxXXXXXXXXXX"]; 此时运行编译,快捷键commd+b 运行程序会出现以下错误,以下是错误的信息:
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_CTTelephonyNetworkInfo", referenced from:
objc-class-ref in libWeChatSDK.a(MTAHelper.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
错误的图片:
![](http://upload-images.jianshu.io/upload_images/1025776-e4edb3d4470da7b3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
错误信息的展示
11.修改错误操作,由于缺少一个依赖库:添加一个CoreTelephony.frame 依赖库,就可以解决了。
![](http://upload-images.jianshu.io/upload_images/1025776-cefd009f14576d1c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
添加依赖库
12.根据微信里面的demo,添加需要的代码。以下是文件目录的一些解释:里面主要的方法就是支付的网络请求以及调用微信客户端的代码。
![](http://upload-images.jianshu.io/upload_images/1025776-40142a741c4428c3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
文件目录
13.添加一个按钮的方法,实现支付。
说明:支付目前来说有两种实现方式,一种是本地的app直接实现跳转进行支付;另一种方式是通过后台服务器进行网络请求。下面的这一种是通过服务器进行支付的跳转。
- (void)WXPay {
NSString*urlString=@"http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=ios";
//解析服务端返回json数据
NSError*error;
//加载一个NSURL对象
NSURLRequest*request = [NSURLRequestrequestWithURL:[NSURLURLWithString:urlString]];
//将请求的url数据放到NSData对象中
NSData*response = [NSURLConnectionsendSynchronousRequest:requestreturningResponse:nilerror:nil];
if(response !=nil) {
NSMutableDictionary*dict =NULL;
//IOS5自带解析类NSJSONSerialization从response中解析出数据放到字典中
dict = [NSJSONSerializationJSONObjectWithData:responseoptions:NSJSONReadingMutableLeaveserror:&error];
NSLog(@"********url:%@",urlString);
if(dict !=nil){
NSMutableString*retcode = [dictobjectForKey:@"retcode"];
if(retcode.intValue==0){
NSMutableString*stamp= [dictobjectForKey:@"timestamp"];
//调起微信支付
//注意:此处的key一定要与demo中的key的字符一致,一个也不能少,一个也不能错。
PayReq* req= [[PayReqalloc]init];
req.partnerId= [dictobjectForKey:@"partnerid"];
req.prepayId= [dictobjectForKey:@"prepayid"];
req.nonceStr= [dictobjectForKey:@"noncestr"];
req.timeStamp= stamp.intValue;
req.package= [dictobjectForKey:@"package"];
req.sign= [dictobjectForKey:@"sign"];
[WXApisendReq:req];
//日志输出
NSLog(@"appid=%@\npartid=%@\nprepayid=%@\nnoncestr=%@\ntimestamp=%ld\npackage=%@\nsign=%@",[dictobjectForKey:@"appid"],req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign);
}else{
NSLog(@"%@",[dictobjectForKey:@"retmsg"]);
}
}else{
NSLog(@"服务器返回错误,未获取json对象");
}
}else{
NSLog(@"服务器返回错误");
}
}
14.在完成此处之后,点击支付按钮会出现下面的问题:
在跳转到支付界面之后,仅仅会出现一个“确定”的白色按钮。如下图:
![](http://upload-images.jianshu.io/upload_images/1025776-755b044a6ffe4494.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
支付出现问题
通过查找信息,是由于配置的参数问题。因此我们不用服务器端进行网络请求直接用自己生成这些参数,然后就可以实现支付功能了。
15.下面是获取参数的解释。
参数解释:
partnerId: 商家向财付通申请的商家id(就是自己的id,也就是在你申请开发者资质认证之后,有一个商户平台,这个平台对应的id,就是你自己的id。好像还没有说明白。)
获取方式:
打开链接,直接将微信发送给你的邮件里面的内容登陆商户平台,就找到了partnerid了。微信商户平台
![](http://upload-images.jianshu.io/upload_images/1025776-97ce70c3eef81dca.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
邮件内容
prepayId: 预支付订单(需要向微信服务器提交申请后返回的一个支付交易ID)
获取方式:
这个一般情况下是服务器端已经申请好的,客户端直接调用。
a、微信的服务端返回的参数的说明:参数说明。(看着很乱,可是呢,还是太乱)
b、还要生成一个签名,这个官方文档也是写了。签名(虽然看着很简单,但是还是搞不定,坑太多,哎,没办法就是这么坑,多看几遍就好了)
根据微信的接口,返回的xml的数据参数。将数据解析之后,就能获得prepayid。
nonceStr: 随机串,防重发(随机字符串,不长于32位)
获取方式:
注意:#pragma mark- 需要引入依赖库libcommonCrypto.tbd并且引入头文件#import <CommonCrypto/CommonGigest.h>
const char*str = [input UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(str,strlen(str),result);
NSMutableString* ret = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH*2];
for(int i = 0 ;i <CC_MD5_DIGEST_LENGTH;i++) {
[ret appendFormat:@"%02X",result[i]];
}
NSLog(@"%@",[ret uppercaseString]);
注意:就是一个随机数。noncestr就是在第一次生成签名的时候的那个随机数,不要再次生成。
timeStamp:时间戳,防重发(标准北京时间,时区为东八区,自1970年1月1日 0点0分0秒以来的秒数)
获取方式:
NSString* timeString = [NSString stringWithFormat:@"%.0f"[[NSDate date]timeIntervalSince1970]];
由于:
@property(nonatomic,assign)UInt32 timeStamp;
所以在提交的时候需要转换成对应的格式,UInt32 格式。
sign:商家根据微信开放平台文档对数据做的签名,链接
这里的签名不同于你第一次申请的prepayid的签名,这里的签名的参数是appid,prepayid,partnerid,timestamp,noncestr,package 这几个排序后再拼接的key最后生成一个sign。
上面这些只是介绍了这些参数如何获取,在下面一篇文章中,开始仔细介绍,最后一步的支付流程,也就是配置参数、服务器相关的一些配置。
这一篇文章主要是介绍配置各种参数的一个demo,并且与服务器接通,实现支付功能。想要参考更多的微信支付细节需要参考前一篇文章
我会把大部分的代码,通过图片的形式,表现出来,只是没有demo,因为涉及到一些敏感参数。
一、下面我先说一下大概的流程:
1.首先你得搞清楚几个参数的意义。这些参数除了第二篇文章的调起微信支付的参数外,还有统一下单里面必须要填的参数。"必填"->"是",这些参数也要准备好。上传的参数的地址:https://api.mch.weixin.qq.com/pay/unifiedorder 。(微信的统一下单的地址)
2.app端通过上传一些微信的公共的“统一下单”要填的参数,返回一些数据,得到支付的参数。微信统一下单要填写的参数。
3.通过得到的参数,调起微信支付,完成支付。
4.由于传递参数的 时候是xml格式,因此我们需要用NSXMLParser解析。
5.在上传参数(统一下单里面的参数)的过程中,我们可以用微信自带的在线签名验证工具。验证工具 。通过NSLog打印出日志,然后对比,把要app端要上传的参数,填写到验证工具里面。
注意:一个参数 的字母都不要少,参数的内容里面的字母,大小写都不要错。
6.需要做两次签名,第一次签名是上传request请求时,拼接的字符串,创建一次sign;第二次签名是请求统一下单之后,主要是用返回的一个prepay_id的一个字符串,根据appid、noncestr、package、partnerid、prepayid、timestamp这些字符串的内容,重新创建一次sign,第二次的sign是为了调起微信支付用的。
校验工具配置参数如下:
![](http://upload-images.jianshu.io/upload_images/1025776-3be66f465a49ed96.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
校验工具
二、我先总结微信支付过程中,出现的问题:
1.打印日志结果是:
![](http://upload-images.jianshu.io/upload_images/1025776-f3d69bc8b24bf88f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
分析:由于是上传到统一下单的接口的参数,缺少参数。这个时候需要打开微信的统一下单的界面,检查自己上传的参数缺少哪一个。
2.打印日志结果:
![](http://upload-images.jianshu.io/upload_images/1025776-d50d338c7a0682a1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
错误信息
这个的错误原因就是签名错误,整理错误的信息 如下:
1>sign签名是否大写。
2>拼接的字符串是否按照ASCII码,从小到大排列。(建议用代码实现排序,不要手动排序,不然很容易出错的)
3>上传的参数格式"key=value&",这其中的key与value是否有错误(我就是因为一个参数的key少写了几个字母),包括是否少写了字母,写错了字母。
4>是否拼接了商户自定义的密钥,也就是在微信商户平台里面自定义的密钥。并且判断是否与自己定义的密钥是否相同。
![](http://upload-images.jianshu.io/upload_images/1025776-b5bd5579860850f4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
密钥
三、微信支付demo示例:
1>这个demo是在前期的文章二中,继续添加文件。
2>工程的目录如下图介绍:
![](http://upload-images.jianshu.io/upload_images/1025776-f96e14eed29efe07.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
工程的目录
3>加密工具:
WXUtil.h 文件
![](http://upload-images.jianshu.io/upload_images/1025776-52cda9a6a9f5ea0b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
WXUtil.h
WXUtil.m文件
![](http://upload-images.jianshu.io/upload_images/1025776-ccd475cc968015e2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
WXUtil.m
4>XMLParseManager.h 文件
![](http://upload-images.jianshu.io/upload_images/1025776-74a5cba537a2dd69.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
XMLParseManager.h
XMLParseManager.m 文件
![](http://upload-images.jianshu.io/upload_images/1025776-d69ad56a5f24b2fa.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
XMLParseManager.m
4>工程代码:
上传参数,返回字符串的代码:
![](http://upload-images.jianshu.io/upload_images/1025776-61cf7f2aa72fd01b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
代码演示
参数上传成功之后会出现以下日志:
![](http://upload-images.jianshu.io/upload_images/1025776-cdc680095e303d5f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
日志打印
调起微信支付的代码:
![](http://upload-images.jianshu.io/upload_images/1025776-879a94bd594b3bd8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
代码演示
做了将近一个月的微信支付终于大功告成了,非常感谢我的好盆友-LucioLee,要是他不帮我,我也是不能这么快就搞定,最后一步,才是微信支付的最困难的一步,非常感谢他对我的帮助。如果还有什么问题没有解决,就给我留言,有时间我会解释的。
0 0
- iOS微信支付的步骤以及问题描述
- iOS微信支付步骤以及出现的问题总结
- IOS集成到支付宝的步骤以及问题
- iOS 微信支付详细步骤及几个可能遇到的小问题
- 关于微信支付ios的问题
- iOS 微信支付详细步骤
- APP接入微信支付步骤,及遇到的问题
- Android-集成微信支付以及遇到的问题浅谈
- android微信支付移植的步骤
- 微信支付的相关步骤
- IOS 微信支付界面乱码问题
- ios 微信支付页面跳转问题
- iOS 微信支付demo问题 kCFStreamNetworkServiceTypeVoIP
- iOS接入微信支付问题
- 微信、支付宝支付集成--Ping++支付接入步骤-iOS版
- 微信支付步骤详解
- Android 微信支付步骤
- Android集成微信支付主要步骤和特别需要注意的问题
- 【项目管理】Mybatis-Generator之最完美配置详解
- 获取页面提交数据的3个方法
- 启动另外的一个应用程序的Activity(三种方式)
- Java项目服务器cpu占用100%解决办法
- 部分网站中加载外部js 禁止的疑问
- iOS微信支付的步骤以及问题描述
- HTML 表单(form) 使用详解
- nodejs aes加解密128算法,base64编码
- Android WebView的Js对象注入漏洞解决方案
- swift学习资源
- 简单的毫秒级C语言耗时打印宏
- 如何用tomcat发布自己的Java项目
- 在应用角度Docker容器技术带来的改变
- 解决无法更新SDK的方法