(3)银联后台接收订单信息并检查通过后,生成对应交易流水号(即TN),并回复交易流水号至商户后台(应答要素:交易流水号等);
(4)商户后台接收到交易流水号,将交易流水号返回给客户端;
(5)客户端通过交易流水号(TN)调用支付控件;
(6)用户在支付控件中输入相关支付信息后,由支付控件向银联后台发起支付请求;
(7)支付成功后,银联后台将支付结果通知给商户后台;
(8)银联将支付结果通知支付控件;
(9)支付控件显示支付结果并将支付结果返回给客户端;
注: 本文档主要关注上述流程中(5)、(9)部分的实现
目前各个平台支持的设备情况如下:
Android平台SDK主要适用于Android 2.3及以上版本的终端设备;
3.测试账号
提供测试使用卡号、手机号信息(此类信息仅供测试,不会发生正式交易)
招商银行借记卡:6226090000000048
手机号:18100000000
密码:111101
短信验证码:123456(先点获取验证码之后再输入)
证件类型:01身份证
证件号:510265790128303
姓名:张三
华夏银行贷记卡:6226388000000095
手机号:18100000000
cvn2:248
有效期:1219
短信验证码:123456(先点获取验证码之后再输入)
证件类型:01身份证
证件号:510265790128303
姓名:张三
4.接入SDK和一些文档的说明
技术支持和业务说明的一些东西
手机控件支付SDK下载demo还有相关的接入文档之类的jar包
因为下载下来的银联手机控件支付开发包里面的demo工程都还没配好的,还有是用eclipse的,一些说明也在下载回来的控件使用指南的文档中有了,这里也会列出来,现在我改用Androidstudio来完成这个demo,如下:
4.1 SDK包说明
商户开发者在获取到银联提供的开发包后请检查SDK文件所在目录upmp_android/sdkProSDK,以下部分提及的文件均在该目录中:
apk目录下包括了支付控件的apk:UPPayPluginExPro.apk
jar目录下包括了商户集成所需要的jar包、so文件(支持arm,armv7,x86,x86_64和arm64-v8a平台)和资源文件。
UPPayAssistEx.jar定义了调用支付控件所需要的接口。
4.2接口说明
1、 支付接口
upmp_android/UPPayAssistEx.jar中定义了启动支付控件的接口,接口定义如下:
public static int startPay(Activity activity, String spId, String sysProvider, String orderInfo, String mode)
参数说明:
activity —— 用于启动支付控件的活动对象
spId —— 保留使用,这里输入null
sysProvider —— 保留使用,这里输入null
orderInfo —— 订单信息为交易流水号,即TN,为商户后台从银联后台获取。
mode —— 银联后台环境标识,“00”将在银联正式环境发起交易,“01”将在银联测试环境发起交易
返回值:
UPPayAssistEx.PLUGIN_VALID —— 该终端已经安装控件,并启动控件
UPPayAssistEx.PLUGIN_NOT_FOUND — 手机终端尚未安装支付控件,需要先安装支付控件
2、检查是否安装银联Apk的接口
upmp_android/UPPayAssistEx.jar中定义了检测银联apk是否安装的接口,接口定义如下:
public static boolean checkInstalled (Context context)
参数说明:
activity —— 用于启动支付控件的context环境
返回值:
true —— 该终端已经安装控件apk
false — 该终端未安装控件apk
4.3 添加SDK包
(1)可以自己新建一个工程来写demo,也可以利用Androidstudio导入eclipse的demo
生成Androidstudio的工程
(2)在appàsrcàmain新建一个assets文件夹,拷贝upmp_android/sdkPro/jar/data.bin到工程的assets/目录下;
(3)在main目录下新建一个jniLibs,然后再拷贝upmp_android/sdkPro/jar/xxx/libentryexpro.so和upmp_android/sdkPro/jar/xxx/libuptsmaddon.so到工程的libs/xxx/目录下,其中xxx为 armeabi-v7a、armeabi、arm64-v8a、x86、x86_64之一。
arm64-v8a(x86_64)是针对arm64(x86 64)架构优化的库文件,引入工程后在arm64(x86 64)机型上性能会提升,但是最终生成的程序包将变大。注意: 如果工程中使用了其他的.so库,那么需要所有.so库都有arm64-v8a(x86_64)的版本。
(4)app目录下新建libs,拷贝upmp_android/sdkPro/UPPayAssistEx.jar到工程的libs/目录下;
拷贝upmp_android/sdkPro/jar/UPPayPluginExPro.jar到工程的libs/目录下,然后进行依赖jar包;
效果如下图:
(5)在工程的AndroidManifest.xml文件中注册支付插件使用的Activity。添加如下
<uses-libraryandroid:name=“org.simalliance.openmobileapi” android:required=“false”/>
<activity
android:name=“com.unionpay.uppayplugin.demo.JARActivity”
android:label=“@string/jar” >
<activity
android:name=“com.unionpay.uppay.PayActivity”
android:configChanges=“orientation|keyboardHidden|keyboard”
android:screenOrientation=“portrait”>
<activity
android:name=“com.unionpay.UPPayWapActivity”
android:configChanges=“orientation|keyboardHidden|fontScale”
android:screenOrientation=“portrait”
android:windowSoftInputMode=“adjustResize” >
同时添加权限:
<uses-permissionandroid:name=“android.permission.INTERNET” />
注意:版本编译时的target应选用OpenMobile API,建议level19以上
(6)调用支付控件
1、支付接口调用
a) 在调用支付控件的代码文件中引入UPPayAssistEx类如:
import com.unionpay.UPPayAssistEx;
b) 接着可以通过以下方式调用支付控件:
// “00” – 银联正式环境
// “01” – 银联测试环境,该环境中不发生真实交易
String serverMode = “01”;
UPPayAssistEx.startPay (activity, null,null, tn, serverMode);
支付完成后,获取支付控件支付结果,并添加相应处理逻辑,只需实现调用Activity中的onActivityResult()方法即可,支付成功时会返回商户客户端支付结果的签名信息。
对于新增的签名信息需注意以下几点:
1. 前台返回的支付结果中包含银联签名,要在商户后台对签名进行校验后才能展示结果。
2. 前台签名使用的密钥和算法与后台结果中的签名一致。
3. 如果商户APP在客户端内进行签名验证,要自行实现签名密钥更新的机制,否则更换密钥后会导致验签失败。(不推荐)
4. 商户订单是否成功支付应该以商户后台收到全渠道返回的支付结果为准,此处支付控件返回的结果仅作为参考。
示例代码如下:
protected void onActivityResult( int requestCode,
int resultCode,
Intent data)
{
if( data ==null ){
return;
}
String str = data.getExtras().getString(“pay_result”);
if( str.equalsIgnoreCase(R_SUCCESS) ){
// 支付成功后,extra中如果存在result_data,取出校验
// result_data结构见c)result_data参数说明
if(data.hasExtra(“result_data”)) {
String sign = data.getExtras().getString(“result_data”);
// 验签证书同后台验签证书
// 此处的verify,商户需送去商户后台做验签
if(verify(sign)) {
//验证通过后,显示支付结果
showResultDialog(" 支付成功! ");
} else {
// 验证不通过后的处理
// 建议通过商户后台查询支付结果
}
} else {
// 未收到签名信息
// 建议通过商户后台查询支付结果
}
}else if( str.equalsIgnoreCase(R_FAIL) ){
showResultDialog(" 支付失败! ");
}else if( str.equalsIgnoreCase(R_CANCEL) ){
showResultDialog(" 你已取消了本次订单的支付! ");
}
}
c) result_data参数说明:
参数说明:
sign —— 签名后做Base64的数据
data —— 用于签名的原始数据
data中原始数据结构:
pay_result —— 支付结果success,fail,cancel
tn —— 订单号
result_data示例如下:
“{“sign”:“ZnZY4nqFGu/ugcXNIhniJh6UDVriWANlHtIDRzV9w120E6tUgpL9Z7jIFzWrSV73hmrkk8BZMXMc/9b8u3Ex1ugnZn0OZtWfMZk2I979dxp2MmOB+1N+Zxf8iHr7KNhf9xb+VZdEydn3Wc/xX/B4jncg0AwDJO/0pezhSZqdhSivTEoxq7KQTq2KaHJmNotPzBatWI5Ta7Ka2l/fKUv8zr6DGu3/5UaPqHhnUq1IwgxEWOYxGWQgtyTMo/tDIRx0OlXOm4iOEcnA9DWGT5hXTT3nONkRFuOSyqS5Rzc26gQE6boD+wkdUZTy55ns8cDCdaPajMrnuEByZCs70yvSgA==”,“data”:“pay_result=success&tn=201512151321481233778”}”
2、检测是否已安装银联Apk接口调用
if(UPPayAssistEx.checkInstalled(context))
{
//当判断用户手机上已安装银联Apk,商户客户端可以做相应个性化处理
}
(7)老版SDK商户修改说明
对于原有sdk接入商户,可在原有修改的基础上更新对应文件后,还需增加如下修改:
1. 增加upmp_android/sdkPro/jar/xxx/libuptsmaddon.so
2. 在工程的AndroidManifest.xml文件增加UPPayWapActivity。添加如下:
<activity
android:name=“com.unionpay.UPPayWapActivity”
android:configChanges=“orientation|keyboardHidden”
android:screenOrientation=“portrait”
android:windowSoftInputMode=“adjustResize”/>
3. 调用接口改为4.2节中支付接口startPay,但原有的startPayByJAR接口仍保留,如下所示:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

文末
当你打算跳槽的时候,应该把“跳槽成功后,我能学到什么东西?对我的未来发展有什么好处”放在第一位。这些东西才是真正引导你的关键。在跳槽之前尽量“物尽其用”,把手头上的工作做好,最好是完成了某个项目或是得到提升之后再走。跳槽不是目的,而是为了达到最终职业目标的手段
最后祝大家工作升职加薪,面试拿到心仪Offer
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
(img-IYTkEhGV-1712235161058)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

文末
当你打算跳槽的时候,应该把“跳槽成功后,我能学到什么东西?对我的未来发展有什么好处”放在第一位。这些东西才是真正引导你的关键。在跳槽之前尽量“物尽其用”,把手头上的工作做好,最好是完成了某个项目或是得到提升之后再走。跳槽不是目的,而是为了达到最终职业目标的手段
最后祝大家工作升职加薪,面试拿到心仪Offer
[外链图片转存中…(img-FfAkALSG-1712235161058)]
[外链图片转存中…(img-fdDXK22Z-1712235161059)]