最近公司需要开发支付功能,经过这两天的工作成功集成了app微信支付、支付宝支付。本文主要讲述微信支付的流程和在集成过程中遇到的坑,和大家分享,共同进步。
一、首先了解一下微信支付的流程
图中展示了整个微信支付的流程:
1.用户使用iOS客户端,选择商品下单。
2.iOS客户端将用户的商品数据传给商户服务器,请求生成支付订单。
3.商户后台调用统一下单API向微信的服务器发送请求,微信服务器生成预付单,并生成一个prepay_id返回给商户后台。
4.商户后台将这个prepay_id返回给商户客户端。
5.用户点击确认支付,这时候商户客户端调用SDK打开微信客户端,进行微信支付。
6.微信客户端向微信服务器发起支付请求并返回支付结果(他们之间交互用的就是prepay_id这个参数,微信的服务器要验证微信客户端传过去的参数是否跟第三步中生成的那个id一致)。
7.用户输入支付密码后,微信客户端提交支付授权,跟微信服务器交互,完成支付
8.微信服务器给微信客户端发送支付结果提示,并异步给商户服务器发送支付结果通知。
9.商户客户端通过支付结果回调接口查询支付结果,并向后台检查支付结果是否正确,后台返回支付结果。
10.商户客户端显示支付结果,完成订单,发货。
调用微信支付前,需要下单、签名等操作,以便获取微信支付所必要的参数。为了提高安全性,下单、签名操作一般是在后台完成。
总结起来在iOS客户端的所关注的支付流程分为三步
1.用户点击支付按钮,生成商品订单发给我们的服务器,
2.服务器返回支付必须的参数,iOS客户端去调用微信app
3.处理支付结果,展示给用户。
相信大家肯定都在手机app上使用过微信或者支付宝支付过,可以动手去试验一下。
二、微信支付的集成
1.要想集成微信支付首先需要商户向微信开放平台申请开发APP应用,微信开放平台会生成APP的唯一标识APPID。然后利用这个APPID向微信sdk注册支付。
2.下载微信支付SDK和demo:下载SDK和demo
3.把下载的支付SDK拖到项目工程中,然后添加项目支付SDK依赖的库,TARGETS-->Build Phases -->Link Binary With Libraries
4.设置iOS客户端的URL,identifier为weixin URL schemes设置为申请到的APPID
5.在Info.plist中设置app访问白名单和支持HTTP协议
6.在appdelegate中注册微信支付
导入头文件#import"WXApi.h",
7.在需要支付的类的方法中发起支付请求
为了提高安全性,下单、签名操作一般是在后台完成。所以上面用到的参数中处理APPID是固定的,其他参数最后都由后台返回给我们直接使用。
8.处理支付结果,最好在回调用请求我们的服务器然后根据这个请求判断支付是否成功。
不管支付成功与否,都是走下面的方法,当我们发送一个sendReq后,就会收到一个来自微信的处理结果。
9.大功告成。
三、在支付过程中可能会遇到的问题
1.在集成过程中如果遇到这样的错误
可以修改为配置
2.点击支付按钮不能打开微信app,原因是参数大多是错误的,在调用微信app时SDK会判断,不通过则不能打开app。
3.打开app之后只有一个白色的确定的按钮,点击它会返回iOS客户端,
引起这个问题的主要原因就是调用微信app时,参数设置的不正确,而且多半是因为签名的问题,就是参数中的sign值的问题,在后台向微信后台请求账单的时候有过一次签名,而客户端吊起支付的签名和那个签名是不同的,多半是后台直接把那个签名发送给客户端,并没有进行二次签名,可以和后台协商,再签一次,因为两次签名的规则都一样,所以就没必要再让客户端写一遍签名规则了.
4.如果项目中集成了友盟和shareSDK分享,那就不用再导入SDK了,因为分享的SDK中已经包括了微信的SDK,如果再次导入会出现很多意想不到的问题。
5.如果支付完成之后不能返回iOS客户端,多半是URL schemes的设置问题。
6.在支付的回调中最好不要直接以回调的errcode来判断支付成功与否,应该请求我们的服务器看时候支付成功,然后展示支付结果给用户。
7.微信支付的金额是以分为单位。
8.微信官方提供的调用微信app所需参数配置的链接,http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php,用于调试支付接口的参数设置;这里所获取到的参数可以全部由我们的后台提供。示例: