最近因为项目需要,需要接入移动支付,下面就根据我们项目集成支付的过程做一个简单总结,包括集成支付宝和微信的大体流程,在集成的过程中遇到的问题以及支付宝和微信支付的简单比较,本人水平有限,如果大家觉得有不妥的地方,还望不吝赐教。
一、支付宝的集成
1.支付宝集成流程:
支付宝这边集成相对于微信来说过程要简单,但是在集成的过程中可能比较容易遇到问题,支付宝官方文档写的比较粗略,有很多问题我也是从网上找了很久,最终集成成功。我在此只讲客户端的工作。
集成前的准备工作:
首先我们需要支付宝的商家服务平台上进行我们的产品签约,并通过审核,然后根据步骤得到PID Key等信息。
在项目中集成支付宝SDK
以支付宝的Demo为例,当我们在App端调用支付接口的时候,是通过以下方式进行支付的:
所以我们客户端这边需要做的就是:构造好订单数据并且签名然后请求支付这一步,请求之后,支付宝那边会给我们返回支付的信息,并且同步会给我们的服务端返回支付信息(这一块由我们的服务端来集成),那么有的人可能问,具体是怎么支付的呢,用户支付的钱去哪了,还有demo中的那些参数怎么用?下面就详细说一下支付宝给我们开发者提供那个demo:
向项目中集成:
我看了一下官方Demo,结构是这样的():
支付的时候,我们主要用到的方法是:
-(void)payOrder:(NSString *)orderStr fromScheme:(NSString *)schemeStr callback:(CompletionBlock)completionBlock;
这个方法的作用就是请求支付并通过回调返回结果,在用的时候我们需要传入orderStr等参数,而orderStr需要我们自己去拼接成文档中要求的格式,所以比较麻烦,我们可以直接修改demo然后放到我们的项目中即可。
下面我们就把支付宝的SDK加到我们的项目中:
在桌面上创建一个空文件夹,把用到的文件全拷贝里面:
在这里,我们可以把demo中的Order类保存着,这样我们就能很方便的创建订单了。一定不要忘了libcrypto.a和libssl.a这两个.a文件!(DFProduct类是我自己创建的,因为项目需要就把demo中写成延展的Product改写成了心新类)。
这时候把我们创建好的文件夹拖到我们项目里面,拖完之后需要做的事情:
找到我们项目TARGETS --->Build Settings ---> Search Paths --->Header Search Paths下:把我们刚才拖到项目中的文件夹选中,然后show in Finder 然后把文件夹拖到
Header Search Paths中:
然后编译看看是否有错误,我这样做之后没有出现错误,按照我上面的操作应该是没有错的。看了一下,很多人在把SDk加入到项目中的时候遇到了以下错误:
这个错误就是上面提到的Header Search Paths设置的错误,按照上述方法重新设置。
创建我们自己的订单
我们可以看到,demo中我们发送请求的时候,有很多参数需要我们设置:
其中有三个参数我们需要先设置:partner、seller、privateKey
这三个参数分别代表了PID(16为数字)、收款方的PID、和合作伙伴秘钥RSA加密后的秘钥(当然这个秘钥是有要求的,生成秘钥的方法可以参考这个:http://blog.it985.com/12276.html),当我们设置完这些参数,然后就剩下Order中的参数了,这些参数比较简单,一般都能看懂是什么意思,然后我们运行,当我们点击支付的时候发现控制台打印了以下信息:
但是我们rsa——pravite明明已经添加了,弄了好久,才明白这是我们设置的秘钥的格式的问题,最后通过以下方法解决了:
1.在RSADataSigner.m文件中 搜索代码 [result appendString:@"-----BEGIN PRIVATE KEY-----\n"]; 将其改成 [result appendString:@"-----BEGIN RSA PRIVATE KEY-----\n"];
2.在RSADataSigner.m文件中 搜索代码 [result appendString:@"\n-----END PRIVATE KEY-----"]; 将其改成 [result appendString:@"\n-----END RSA PRIVATE KEY-----"];
到此,我们基本上把官方demo集成到我们的项目当中了,剩下的要做的是就是我们这边生成订单的基本信息,比如价格等,还有一个参数:order.notifyURL
这个参数是服务器异步通知页面路径,这个需要我们服务器给我们,当我们这边发送请求支付信息之后,支付宝服务器会返回支付结果到客户端,同时也会返回支付信息到我们的服务端,这时候通过这个路径,我们的服务端就可以记录我们前端的请求信息。
完成了这些步骤,基本的集成也就结束了,我们就能正常的发送支付请求并且支付成功了!
二、微信支付
下面简单说以下微信支付,我觉得微信支付的流程可能会比支付宝麻烦点,但是SDK却比支付宝好集成。
首先也是要在微信开放平台上注册商户信息并提交审核,然后申请开通微信支付的能力,这样我们就可以集成SDK了。
SDK很简单,下载好后拖入到我们的项目中即可,然后
1、项目设置APPID
商户在微信开放平台申请开发APP应用后,微信开放平台会生成APP的唯一标识APPID。在Xcode中打开项目,设置项目属性中的URL Schemes为您的APPID。
2、注册APPID
商户APP工程中引入微信lib库和头文件,调用API前,需要先向微信注册您的APPID,代码如下:
[WXApi registerApp:@"wxd930ea5d5a258f4f" withDescription:@"demo 2.0"];
与支付宝支付不同的是,微信支付在支付的时候会在我们的服务端进行一个预支付,这时候有我们的服务端来生成预付单,生成预付单之后会获得一个prepay_id,然后服务端将参数再次签名发送到App,App端请求支付即可。
详见微信支付官方文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
三、支付过程中关于支付界面的设计:
在支付的时候我们需要弹出一个页面,以供用户填入支付的金额信息,界面的设计是这样的:
1.这时候选用的键盘样式:UIKeyboardTypeDecimalPad(带小数点)UIKeyboardTypeNumberPad(不带小数点)
2.金额的填写,虽然界面挺简单,但是金额的填写要求比较高,输入的金额要求是最多小数点后两位,而且小数点输入只能有一次,这个我们可以借助textField的代理方法:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{}
来实现:
_isHaveDian是Bool型的属性
网友评论