Android平台招商银行“一网通”支付对接采坑记
公司最近的App中需要做支付功能,支付中需要支持微信支付、支付宝支付、一网通支付。本文主要记录在对接Android平台中的“一网通”过程中遇到的坑,如果有类似需求的朋友,可供你参考。
文章目录
- 一、为什么说招商银行“一网通”支付有点坑?
- 1.微信、支付宝支付特点:
- 2.“一网通”支付有何不同。
- 二、“一网通”开发注意事项
- 1.H5支付(Webview)
- 2.关于签名的处理
- 3.h5中支付回调处理注意
- 4.本地App 支付回调处理注意
- 三、小结
一、为什么说招商银行“一网通”支付有点坑?
1.微信、支付宝支付特点:
这两个支付流程相似,如安装了相应 的App,可以直接调用App支付,如未安装,则用H5 来支付。
不管哪一种情况,以上两种都提供了SDK做了很好的封装。特别是在支付后的状态(支付成功支付失败)都都有相应的支付结果回调返回,让开发者对接起来很方便。有支付结果回调,接下来的流程处理就很顺手。
2.“一网通”支付有何不同。
“一网通”没有类似微信、支付宝的SDK,旧有的“一网通”虽然有键盘封装的SDK,但是在新的接口中,已不再需要。也就是说“一网通”没有任何支付相关的SDK,支付中涉及到的业务(webview加载、签名、加密、支付结果回调处理)都需要开发者自行处理。所以坑就坑在这里。
虽然很坑,流程也是可行的。无非,就是麻烦一 点而已~
二、“一网通”开发注意事项
官方开发文档地址,点击前往
1.H5支付(Webview)
当手机检查到没有安装“一网通”App时,用webview来加载网页支付,需要注意,一般的H5中加载时是get
请求,而此处是post
请求。
参见:查询协议API
<form action="请求地址" method="post" /><input type="hidden" name="jsonRequestData" value='以上json字符串' /><input type="hidden" name="charset" value='UTF-8' />
</form>
实例代码参考:
override fun refreshPage() {//payUrl是“一网通”的接口链接webView?.postUrl(payUrl, EncodeUtils.urlDecode("jsonRequestData=$requestData").toByteArray())}
webview中可以用腾讯的x5浏览器,处理加载状态,自行添加加载进度条。
2.关于签名的处理
参考“一网通”官方文档处理,流程可以根据和服务器的约定确定。
实例代码参考:
//一网通支付(H5网页端)private fun prePaymentYWtH5(payType: String) {showLoadingDialog(R.string.common_loading)PayApi.prepayment(orderNo, payType).attachToLifecycle(this).execute(object : CZObjectCallback<PreOrderEntity>(PreOrderEntity::class.java) {override fun success(data: PreOrderEntity) {dismissLoadingDialog()val content = data.prepayPayRoute.toPayYwtH5(content).navigation(this, CODE_PAY_H5)}override fun error(code: Int, message: String) {super.error(code, message)dismissLoadingDialog()shortToast(message)}})}
例如:可以在生成预付款信息的接口返回相应的信息,返回的信息中就处理了平台约定的加密规则这些,客户端直接调用。数据类似这样:
jsonRequestData ={"reqData": {"amount": "0.01","branchNo": "0023","date": "20190115","dateTime": "20190115172341","merchantNo": "0101168","orderNo": "43761407182063502","payNoticeUrl": "http://test.1688hyl.com/v1.0/cmbchina/","returnUrl": "haoyunlai://callback"},"sign": "e33e11ddba21ef5d43da6f4e8ce896a08b946ccd8a445c5a6f9ff39c8884dbd6d54","signType": "SHA-256","version": "1.0"
}
3.h5中支付回调处理注意
支付结果回调:
override fun initListener() {super.initListener()webView?.webViewClient = object : WebViewClient() {override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {//商户按钮 10s 倒计时或点击“返回商户”监听事件 ,RETURN_URL是和平台约定的接口,具体参考官方文档 if (url.equals(RETURN_URL, ignoreCase = true)) {//webView成功时的回调PayRoute.toPayResult(PayResultActivity.PAY_RESULT_SUCCESS).navigation(this) {// do what you want to do}}return super.shouldOverrideUrlLoading(view, url)}}//webview中返回事处理getTitleLayout().setOnBackClickListener {setResult(Activity.RESULT_OK)finish()}}
注意:在用户点击“返回商户”或在倒计时10秒结束后表式支付成功,这里可以理解为有支付成功的回调,但是 如果用户点击了返回事件,“一网通”并没有提供该支付状态的回调,点击返回事件可能发生在未支付、支付失败等时机,所以这里我们需要自行处理。我在这里的处理方式是,在用户回到上一界面时,马上检查当前的订单号状态,根据服务器的返回结果来判断用户是否支付成功。
参考实例代码:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {super.onActivityResult(requestCode, resultCode, data)if (requestCode == CODE_PAY_H5 && resultCode == Activity.RESULT_OK) {//一网通h5界面 监听用户返回事件 检查支付状态 跳到相应的状态界面checkPayResult(orderNo)}}
4.本地App 支付回调处理注意
支付时如果检查到已安装招商银行一网通的支付App,则调用本地App支付。
参考实例代码:
//唤醒一网通客户端private fun callCMBApp(preData: String) {val url ="cmbmobilebank://CMBLS/FunctionJump?action=gofuncid&funcid=200007&serverid=CMBEUserPay&requesttype=post&cmb_app_trans_parms_start=here&charset=utf-8&jsonRequestData=$preData"try {val intent = Intent()val data = Uri.parse(url)intent.data = dataintent.action = "android.intent.action.VIEW"startActivity(intent)} catch (e: Exception) {LogUtil.d(e.printStackTrace())}}
执行上述代码后,跳到第三方的app去支付。
注意:一网通本地支付结果状态没有类似微信支付的回调,需要自行处理。
参考官方文档:支付成功后或失败后 需要回到当前的App,此时注意设置当前的启动模式为singleTop(栈顶复用,防止出现多个机同的界面)
另外也需要注意设置scheme(第三方支付app唤醒当前App),这里需要格外注意,当时按照文档
Android接入要点说明
在scheme设置上官网是这样告诉我们的
结果试了很久都不能成功,联系”招商银行一网通支付技术支持“后,尝试写demo 模拟来唤醒,最后调整格式才成功。这里可以深入了解一下scheme如何唤醒app。
intent.setData(Uri.parse(“haoyunlai://payCallback”))
如果你按照官方也不能成功,可以参考一下我的实例代码,如下所示:
<!-- 支付 --><activityandroid:name=".PayActivity"android:configChanges="orientation|keyboardHidden|screenSize"android:launchMode="singleTop"android:screenOrientation="portrait"><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><!--第三方app 唤醒app 方法intent.setData(Uri.parse("haoyunlai://payCallback"));--><dataandroid:host="callback"android:scheme="haoyunlai" /></intent-filter></activity>
检查支付回调,为了安全性,直接向服务器查询订单状态来判断。
实例代码如下:
//从后台进入前台时执行的方法: 针对一网通本地支付状态的回调监听override fun onRestart() {super.onRestart()checkPayResult(orderNo)}//或者在设置启动模式为singleTop后 建议用以下方法替换。override fun onNewIntent(intent: Intent?) {super.onNewIntent(intent)checkPayResult(orderNo)}
三、小结
在对接过程中,先仔细阅读一下官方文档,再参考一下网上的教程,看一下有哪些坑已被采过。最后在支付对接的过程如有疑问,最好直接联系 招商银行一网通支付技术支持,有些问题 文档上并没有提到,有些问题需要一网通那边配合解决。以我对接为例,在支付成功后,在支付成功的界面上,开始无论如何都无法点击”返回商家“触发事件,检查了和服务器的各种设置,如检查returnurl设置,都是对的。最后让那边配合检查一下,最后就好了。所以有问题及时和支持人员沟通,虽然和微信支付、支付宝支付比起来有点坑,但终究还是能对接成功的。
以上,是我对接过程中的采坑记录,如有任何疑问或不对的地方或更好的地方 ,欢迎交流~
参考:
1.android招商银行“一网通”开发详解
2.招行一网通集成
3.招商银行官方开发文档
Android平台招商银行“一网通”支付对接采坑记相关推荐
- 招商银行一网通支付(php接入招商银行一网通支付)
接入招商银行的目的,可以得到银行的补贴.生活中我在商城停车扫码付费时,可以选择招商银行一网通支付,停车费8元,可以随机减1到3元.补贴是银行设置的,是银行处理的,不需要商户操作(这点做的很好,比其它银 ...
- 【SAP PO】X-DOC:SAP PO 接口配置 REST 服务对接填坑记
X-DOC:SAP PO 接口配置 REST 服务对接填坑记 1.背景 2.PO SLD配置 3.PO https证书导入 1.背景 (1)需求背景: SAP中BOM频繁变更,技术人员在对BOM进行变 ...
- Android平台GB28181接入端如何对接UVC摄像头?
我们在对接Android平台GB28181接入的时候,有公司提出这样的需求,除了采集执法记录仪摄像头自带的数据外,还想通过执法记录仪采集外接UVC摄像头. 实际上,这块对我们来说有点炒冷饭了,不算新的 ...
- Taro小程序采坑记
Taro,京东凹凸实验室出品的适配多端的一个框架, Taro 是一套遵循 React 语法规范的 多端开发 解决方案.现如今市面上端的形态多种多样,Web.React-Native.微信小程序等各种端 ...
- 【uniapp原生插件】招商银行一网通支付androidiOS
招行支付插件说明 参考uni插件市场 [wx]gaogaoEagle 插件集成准备 从招行获得appid和appScheme manifest.json中App原生插件配置,云端插件选择试用或购买的插 ...
- 微信支付--采坑记(1)
随着互联网的兴起,网上支付已经风靡了各个角落,然而移动支付中比较火的当然属于微信支付了. 今天跟大家分享一下微信开发中所遇到的一些问题. 1.首先在微信下载微信支付的SDK, 最好下载最新的SDK, ...
- 基于原生PHP完成小程序支付对接踩坑(V2版本)
这个是我,2021年写的代码了,最近参加比赛,涉及到支付,于是又拿来用,幸好代码健全,但是去微信平台看,已经出v3支付了,再次,这个教程以及代码部分,仅仅用于V2版本,请勿踩空! 文章目录 前言 一. ...
- 支付开发填坑记之支付宝
支付宝在所有支付方式中最好开发的了,因为文档比较清晰,而且开发起来也比较简单.因此,支付宝的坑是相对较少的. 原文地址 APP支付 APP支付步骤为: 获取支付宝的配置信息. 生成商家订单信息. 根据 ...
- input change获取改变之前的值和改变之后的值_input[type=#x27;number#x27;],ios安卓采坑记
近日,在为公司维护移动端H5代码的过程中,因为平台实现的差异,中间踩了不少坑.借此机会记录一下,也希望大家能有个了解,少走弯路.这一切的一切,都要从一个简单的需求开始说起. 某日,产品.测试反馈,对于 ...
最新文章
- 同时拿到BATJMD的Offer是怎样的一种体验?
- 容器中的JVM资源该如何被安全的限制?
- sqlserver2008清除日志方法_服务器磁盘使用率100%解决方法
- glide 下载golang.org包问题
- 基于FPGA的简易OFDM调制解调系统开发
- iphonex如何关机_历时一个月,跨越一千里,我找回了在澳门被偷的iphoneX
- 黑客入侵交警计算机系统删交通违法记录牟利
- VC++等待光标的两种实现方式
- 需求不容易确定的项目不要接
- L2-010 排座位 (25 分)
- 有关圣诞节表白的c语言程序,关于圣诞节表白唯美的句子
- 深入理解JVM--JVM结构
- 面试题:用两个队列实现一个栈
- 台式计算机如何自动开关机,台式机怎么设置自动开关机
- 关于软件开发中遇到的问题解决思路
- vue返回上一页(后退)的几种方法与区别
- segment routing详解十一问
- 《Windows办公指南》魔改C:\Windows\System32\drivers\etc\hosts实现一个数据中心
- E.03.22 Learning Apps Have Boomed in the Pandemic. Now Comes the Real Test.
- uniapp用户设置字体大小