你的位置:首页 > 操作系统

[操作系统]银联支付


一、概述

银联手机支付控件(以下简称支付控件),主要为合作商户的手机客户端或手机Web网站提供安全、便捷的支付服务。目前支付控件支持Android和iOS两个平台,用户通过在支付控件中输入银行卡卡号、手机号、密码(借记卡和预付卡)或者CVN2、有效期(信用卡)、验证码等要素完成支付。

二、支付流程介绍

通过支付控件进行交易的流程如下图:

 

流程图说明:

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

(2)商户后台收到订单生成请求后,按照《UPMP商户接入接口规范》组织并推送订单信息至银联后台;

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

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

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

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

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

(8)银联将支付结果通知支付控件;

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

注: 本文档主要关注上述流程中(5)、(9)部分的实现

目前各个平台支持的设备情况如下:

Android平台SDK主要适用于Android 2.1及以上版本的终端设备;

iOS版本支付控件适用iOS 5.1及以上版本终端设备。

二、测试帐号

  • 提供测试使用卡号、手机号信息(此类信息仅供测试,不会发生正式交易)

招商银行预付费卡:

卡号:6226 4401 2345 6785

密码:111101

三、iOS客户端

本小节提供给那些具有一定iOS编程经验和了解面向对象概念的读者使用。

SDK文件所在目录:upmp_iphone/sdk,以下部分所说文件,均在该目录中查找。

  1. SDK说明

SDK分为以下两个版本:

  1. 支持纯无卡交易静态库,以下简称UPPayPlugin,包含文件:

UPPayPlugin.h

UPPayPluginDelegate.h

libUPPayPlugin.a

  1. 支持纯无卡交易和VIPOS音频口支付静态库,以下简称UPPayPluginPro,包含文件:

UPPayPluginPro.h

UPPayPluginDelegate.h

libUPPayPluginPro.a

  1. 接口说明
  1.  

 

各个参数的介绍如表3-1:

表3-1 接口参数说明

 

  1. 添加SDK包
  1. 根据商户选择的SDK版本,将sdk/inc目录和sdk/libs目录下对应版本的三个文件添加到UPPayDemo工程中;
  2. 如果你选择的是UPPayPlugin版本,添加QuartzCore.framework、Security.framework到工程中;
  3. 如果你选择的是UPPayPluginPro版本,添加QuartzCore.framework、AudioToolbox.framework, CoreAudio.framework、 MediaPlayer.framework, AVFoundation.framework和Security.framework到工程中;
  4. 在工程的Build Settings中找到Other Linker Flags中添加-ObjC宏;
  1. 调用插件
  1. 在需要调用支付控件的源文件内引用头文件UPPayPlugin.h或UPPayPluginPro.h(注意:如果工程的compile source as 选项的值不是Objective–C++,则引用此头文件的文件类型都要改为.mm)
  2. 通过调用

  + (BOOL)startPay:(NSString*)tn 

mode:(NSString*)mode 

viewController:(UIViewController*)viewController 

delegate:(id<UPPayPluginDelegate>)delegate;

实现控件的调用

  1. 处理支付结果

银联手机支付控件有三个支付状态返回值:success、fail、cancel,分别代表:支付成功、支付失败、用户取消支付。这三个返回状态值以字符串的形式作为回调函数参数(NSString*)result返回。通过在工程中添加头文件“UPPayPluginDelegate.h”,在处理交易结果的界面,实现UPPayPluginDelegate接口,根据该头文件中的回调函数:-(void)UPPayPluginResult:(NSString*)result来实现回调方法,从而可以根据支付结果的不同进行相关的处理。

四、Android客户端

本小节提供给那些具有一定Android编程经验和了解面向对象概念的读者使用。

  1. SDK包说明

 

SDK分为以下两个版本:

  1. 支持纯无卡交易版本,该版本主要位于upmp_android/sdknocard目录下:

 

apk目录下包括了通过apk方式接入的UPPayPluginEx.apk

jar目录下包括了静态库集成方式所需要的jar包、so文件(支持arm,armv7,x86和mips平台)和资源文件。

注意:

data.bin文件为图片资源文件,必须存放在工程的res/drawable目录下;

UPPayPluginEx.jar为jar包形式的控件,必须存放在工程的libs目录下;

libentryex.so为动态库文件,请根据需要存放于工程的libs/xxx/目录下,其中xxx为armeabi,armeabi-v7a,mips,x86之一。

  1. 支持纯无卡交易和有卡交易的版本,有卡交易支持银联的迷你IC卡产品、智能SD卡产品、VIPOS产品等,该版本主要位于upmp_android/sdkPro目录下:

 

apk目录下包括了通过apk方式接入的UPPayPluginExPro.apk

jar目录下包括了静态库集成方式所需要的jar包、so文件(支持arm,armv7,x86和mips平台)和资源文件。

注意:

data.bin文件为图片资源文件,必须存放在工程的res/drawable目录下;

UPPayPluginExPro.jar为jar包形式的控件,必须存放在工程的libs目录下;

libentryexpro.so为动态库文件,请根据需要存放于工程的libs/xxx/目录下,其中xxx为armeabi,armeabi-v7a,mips,x86之一。

  1. 接口说明

upmp_android/UPPayAssistEx.jar包中定义了启动支付控件的接口,接口定义如下:

 

其它辅助接口:

 

  1. 添加SDK包

拷贝upmp_android\sdknocard\UPPayAssistEx.jar(或upmp_android\sdkPro\UPPayAssistEx.jar)到工程的libs\目录下;

同时也可将upmp_android\sdknocard\apk\UPPayPluginEx.apk (或upmp_android\sdkPro\apk\UPPayPluginExPro.apk)复制到客户端工程的assets目录下,效果如下图:

 

   接着请右键单击工程,选择Build Path中的 Configure Build Path …,选中Libraries这个tab,并通过Add Jars…导入工程libs目录下的UPPayAssistEx.jar包。如下图: 

  1. 调用支付控件
  1. 在调用支付控件的代码文件中引入UPPayAssistEx类如:
  2.  
  3. 接着可以通过以下方式调用支付控件:
  4.  

支付完成后,获取支付控件支付结果,并添加相应处理逻辑,只需实现调用Activity中的onActivityResult()方法即可,实例代码如下:

 

 五、手机Web站点

  1. 支持浏览器
  • UC浏览器Android版本(通过方式一接入,对方式二能支持,但不检测)
  • UC浏览器iOS版本(通过方式二接入)
  • QQ浏览器Android版本 3.6及以上(通过方式二接入)
  • 360浏览器Android版本2.7及以上(通过方式二接入)
  • Opera浏览器Android HD版本1.3及以上(通过方式二接入)
  • 系统原生浏览器Android版本和iOS版本(仅支持通过方式二接入)

具体信息参考附录一

  1. 方式一

调用支付控件的Web页面需要嵌入代码

 

其中<embed>为银联手机支付UC插件标签项,在UC浏览器中显示为银联手机支付按钮, 。其中前几个参数,不要进行修改:

type="application/x-unionpayplugin" uc_plugin_id="unionpay" height="53" width="178"

其中,订单信息部分构成参考Web订单生成。

支付控件页面嵌入代码范例(消费交易)

 

  1. 方式二

    调用银联手机支付控件页面需要嵌入代码

 

其中,<a>为银联手机支付非UC浏览器接入控件采用标签项,在非UC浏览器中显示为银联手机支付按钮, 。银联手机支付图标部分指明该图标的路径。

 

支付控件页面嵌入代码范例

 

  1. Web订单生成

展示在Web页面上的订单信息生成方式如下:

  1. 将表5-1中订单信息中的resultURL的值采用URLEncode方式进行编码,按表5-1的格式与其他字段拼接出订单信息。
  2. 将步骤a)中产生的结果采用base64进行编码。
  1. 将步骤b)中产生的结果采用URLEncode方式进行编码得到最终展示的数据。

即:

paydata = urlEncode(base64(“tn=” + tn + ”, resultURL=” + urlEncode(resultURL) + ”, usetestmode=” + usetestmode))

 

Web站点订单中的每个参数对由参数值组成,参数间“,”隔开。参数间不要有空格,格式如下:

表5-1 web订单构成

 

 

表5-2 订单信息域说明

 

  1. 接入浏览器方案推荐
  1. 针对UC、QQ、360浏览器(浏览器服务器上版本为最新的)直接页面显示对应tag就可以
  2. 针对Opera(虽然对接了,但是其服务器上尚未提供较新版本插件下载),页面提示支持的控件版本,并告知用户查看控件版本的方式和升级的地址
  3. 针对未对接的浏览器(主要包括原生浏览器),按照方式2处理
  1. 控件下载地址

Android

http://mobile.unionpay.com/getclient?platform=android&type=securepayplugin

iOS

http://mobile.unionpay.com/getclient?platform=ios&type=securepayplugin 

六、开发者注意事项

  1. 通过浏览器方式接入支付控件时,传入的resultURL应该可以接受参数,并且需要采用URLEncode方式进行编码,编码之前的url形式如:

https://example.com/example?argName=

七、常见问题总结

  1. iOS平台常见问题
  • 编译错误解决

UPPayDemo工程在编译的过程中可能会出现Undefined symbols for architecture armv6/armv7/i386的编译错误。如果出现这样的错误,有以下几种解决办法:

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

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

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

③ 将工程的compile source as 选项的值不是Objective–C++;

2)由于在UPPayDemo工程中添加了自定义的库文件libUPPayPlugin.a,当编译Demo工程时,应该检查工程设置Search Paths里的Framework Search Paths、Header Search Paths、Library Search Paths的路径设置,看设置路径是否正确,另外还要注意里边是否多余一些不确定的路径