iOS 银联支付开发步骤详解

上次郑州iOS讲师歪哥分享了一个关于微信支付的技术文章(微信支付文章链接:http://hn.lanou3g.com/lozx/2346.html),很多粉丝都疯狂点赞,今天小编再给大家分享一篇银联支付的技术文章,看完之后,再也不用担心支付那些问题了!

  首先吐槽下:银联SDK下载地址好难找。

  1.下载地址

  首先附上SDK下载地址:https://open.unionpay.com/ajweb/help/file


  选择手机控件支付:


  下载后我们需要找到以下位置SDK和支付文档

  银联支付控件静态库,包含以下两个文件:inc和libs下

  UPPaymentControl.h

  libPaymentControl.a


  2.支付流程介绍


  支付流程图

  流程图说明:

  (1)用户在客户端中点击购买商品,客户端发起订单生成请求到商户后台;

  (2)商户后台收到订单生成请求后,按照《手机控件支付产品接口规范》组织并推送订单信息至银联后台;

  (3)银联后台接收订单信息并检查通过后,生成对应交易流水号(即TN),并回复至商户后台(应答要素:交易流水号等);

  (4)商户后台接收到交易流水号(TN),将交易流水号返回至客户端;

  (5)客户端通过交易流水号(TN)调用支付控件;

  (6)用户在支付控件中输入相关支付信息后,由支付控件向银联后台发起支付请求;

  (7)支付成功后,银联后台将支付结果通知给商户后台;

  (8)银联后台同时也将支付结果通知支付控件;

  (9)支付控件显示支付结果并将支付结果返回至客户端;

  此处备注:我们是通过后台获取订单,我们可以根据商品id等信息通过后台接口获取订单信息,对订单支付流程的签名加密过程后台完成。

  3.添加SDK包

  使用UPPaymentControl需要将paymentcontrol/inc目录下UPPaymentControl.h文件和paymentcontrol/libs目录下的libPaymentControl.a文件添加到商户应用的工程中

  4.工程配置

  1.使用UPPaymentControl需要添加CFNetwork.framework、SystemConfiguration.framework 、libz、libPaymentControl.a到工程中.

  2、在工程info.plist设置中添加一个URL Types回调协议(在UPPayDemo工程中使用“UPPayDemo”作为协议),用于在支付完成后返回商户客户端。


  3、http请求设置

  在Xcode7.0之后的版本中进行http请求时,需要在工程对应的plist文件中添加NSAppTransportSecurity Dictionary 并同时设置里面NSAllowsArbitraryLoads 属性值为 YES

  4、添加协议白名单

  在Xcode7.0之后的版本中进行开发,需要在工程对应的plist文件中,添加LSApplicationQueriesSchemes Array并加入uppaysdk、uppaywallet、uppayx1、uppayx2、uppayx3五个item,具体设置可参考以下截图:

  5.加-ObjC宏

  选择工程targets——》build settings ->Linking->other linker flags

  6.调用插件

  在需要调用支付控件接口的代码文件内引用头文件UPPaymentControl.h。

  (注意:如果工程的compile source as 选项的值不是Objective–C++,则引用此头文件的文件类型都要改为.mm)

  商户App从商户服务器获取tn(注:先通过调用后台接口获取订单信息)

  * @param tn 订单信息

  * @param schemeStr 调用支付的app注册在info.plist中的scheme

  * @param mode 支付环境"00"代表接入生产环境(正式版本需要);"01"代表接入开发测试环境

  * @param viewController 启动支付控件的viewController

  * @return 返回成功失败


  7.返回结果接口调用

  支付控件结果处理函数handlePaymentResult: completeBlock:需要在工程AppDelegate文件的application: openURL: sourceApplication: annotation: 方法中进行调用。

  支付控件结果处理函数handlePaymentResult: completeBlock:包含两个参数,参数1url为支付结果串,由handlePaymentResult: completeBlock:方法解析url内容;参数2completionBlock为商户APP定义的结果处理方法,包含两个传入参数code和data,其中code表示支付结果,取值为suceess,fail,cancel分别表示支付成功、支付失败和支付取消,data表示结果签名数据,商户使用银联公钥验证结果真实性。

  completeBlock中的NSDictionary *data结构如下:

  sign —— 签名后做Base64的数据

  data —— 用于签名的原始数据,结构如下:

  pay_result —— 支付结果success,fail,cancel

  tn —— 订单号

  Data转换为String后的示例如下:

  "{"sign":"ZnZY4nqFGu/ugcXNIhniJh6UDVriWANlHtIDRzV9w120E6tUgpL9Z7jIFzWrSV73hmrkk8BZMXMc/9b8u3Ex1ugnZn0OZtWfMZk2I979dxp2MmOB+1N+Zxf8iHr7KNhf9xb+VZdEydn3Wc/xX/B4jncg0AwDJO/0pezhSZqdhSivTEoxq7KQTq2KaHJmNotPzBatWI5Ta7Ka2l/fKUv8zr6DGu3/5UaPqHhnUq1IwgxEWOYxGWQgtyTMo/tDIRx0OlXOm4iOEcnA9DWGT5hXTT3nONkRFuOSyqS5Rzc26gQE6boD+wkdUZTy55ns8cDCdaPajMrnuEByZCs70yvSgA==","data":"pay_result=success&tn=201512151321481233778"}"

  对于新增的签名信息需注意以下几点:

  1. 前台返回的支付结果中包含银联签名,要在商户后台对签名进行校验后才能展示结果。

  2. 前台签名使用的密钥和算法与后台结果中的签名一致。

  3. 如果商户APP在客户端内进行签名验证,要自行实现签名密钥更新的机制,否则更换密钥后会导致验签失败。(不推荐)

  4. 商户订单是否成功支付应该以商户后台收到全渠道返回的支付结果为准,此处支付控件返回的结果仅作为参考。

  调用支付接口后,结果处理方法示例代码:


  5.常见问题总结

  5.1编译时提示Undefined for architecture XXX 错误

  1)由于支付控件使用到了C、C++和OC混编的情况,所以商户工程引入UPPaymentControl.h头文件以后可能会出现链接错误,这个时候可以通过以下三种方式解决:

  ① 将涉及到引用UPPaymentControl.h的源文件的后缀名都改为.mm;

  ② 如果商户不想修改源文件的后缀名,可以在工程中添加一个空的继承自NSObject的类,并将文件.m后缀名该改为.mm即可方法为new file->Objective-C class->类名自取->保存->修改后缀名为.mm;

  ③ 将工程的compile source as 选项的值设置为Objective–C++;

  2)由于在UPPayDemo工程中添加了自定义的库文件libPaymentControl.a

  ,当编译Demo工程时,应该检查工程设置Search Paths里的Framework Search Paths、Header Search Paths、Library Search Paths的路径设置,看设置路径是否正确,另外还要注意里边是否多余一些不确定的路径。

  3) 将xcode工程中Build Setting -> Apple LLVM compiler Language 标签下的C++ Language Dialect 和 C++ Standard Library 属性值修改为 Compiler Default如实在无法解决,尝试添加-ObjC宏的地方修改为 -force_load+空格+控件路径,如:-force_load $(PROJECT_DIR)/ libPaymentControl.a,如果还报错,上下文应该会有libPaymentControl.a文件找不到异常,比如ld: file not found: /Users/apple/Desktop/Communication 2/ libPaymentControl.a

  clang: error: linker command failed with exit code 1 (use -v to see invocation)

  请确定libPaymentControl.a文件确实存在于此路径,可能为上下文路径配错。

  5.2.控件闪退异常'NSInvalidArgumentException', reason: '-[__NSCFConstantString newSizeWithFont:详略]'

  出现以上问题是由于添加-ObjC宏的地方没有配置正确,如果配-ObjC实在解决不了的话,可尝试去掉-ObjC,改为-force_load+空格+控件路径,如:-force_load $(PROJECT_DIR)/ libPaymentControl.a。

  5.3.orientation异常

  详细现象为控件崩溃,报错信息:Terminating app due to uncaught exception ‘UIApplicationInvalidInterfaceOrientation’, reason: ‘Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES’ 
请勿修改横竖屏配置,iphone控件只能竖屏,ipad控件才支持横竖屏。
如果app本身为横屏,请代码控制横竖屏,勿修改配置。

  5.4.其他第三方静态库(如支付宝、微信等)的文件产生冲突duplicate symbols for architecture XXX

  请尝试将添加-ObjC宏的地方修改为 -force_load+空格+控件路径,如:-force_load $(PROJECT_DIR)/ libPaymentControl.a,这样做不会影响支付宝等其他支付渠道功能。

  5.5.控件界面无限加载

  1. 调用控件的逻辑应当在主线程中执行,子线程中尽量不要进行UI操作,无限加载等待实际是子线程死锁所致。
2. 请参考控件使用指南iOS “添加SDK包“里“添加-ObjC宏”,特别注意大小写不要弄混。(此步骤操作有问题时也可修改为 -force_load+空格+控件路径,如:-force_load $(PROJECT_DIR)/ libPaymentControl.a)。
3. Build Setting -> Apple LLVM compiler Language-C++:


  这样, 我们就完成了微信支付iOS客户端的代码, 大家的关注哦!

  demo链接:https://github.com/syq1122/-

  

  本文链接:http://hn.lanou3g.com/lozx/2364.html

  提供分享技术,传递智慧,让技术更简单。蓝鸥让教育回归本质,我们在行动。转载请注明出处。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值