最近有朋友需要在微信小程序内使用招商银行一网通支付,目前能支持的支付类型只有H5支付接口,所以记录下整个调试流程和调试过程可能出现的问题,写测试报告时需要注意的事项也记录下,以备以后需要时,可以及时找出,免踩坑。
微信小程序下H5支付,用户操作流程,小程序(小程序原生)内通过点击—》访问到提交订单页面(webview包含的订单外链页)-》跳转到一网通H5支付页面——》支付成功回到支付成功页面(webview包含的订单外链页)——》点击支付完成回到小程序页面(小程序原生)
一网通H5操作流程图

以下流程采用PHP进行调试和测试
先定义一个总配置数组

$config = ['use_sandbox' => true, // 是否使用 招商测试系统'branch_no' => 'xxxx',  // 商户分行号,4位数字'mch_id'    => 'xxxx', // 商户号,6位数字'mer_key'   => '1234567890123456', // 秘钥16位,包含大小写字母 数字// 招商的公钥,建议每天凌晨2:15发起查询招行公钥请求更新公钥。'cmb_pub_key' => 'xxxx','op_pwd'    => 'xxxxxx', // 操作员登录密码。'sign_type' => 'SHA-256', // 签名算法,固定为“SHA-256”'limit_pay' => 'A', // 允许支付的卡类型,默认对支付卡种不做限制,储蓄卡和信用卡均可支付   A:储蓄卡支付,即禁止信用卡支付'notify_url' => 'http://cmb.admin.com/cmb_tz.php', // 支付成功的回调'sign_notify_url' => 'http://cmb.admin.com/cmb_tz.php', // 成功签约结果通知地址'sign_return_url' => 'http://cmb.admin.com', // 成功签约结果通知地址'return_url' => 'http://cmb.admin.com/cmb_ok.php', // 如果是h5支付,可以设置该值,返回到指定页面
];

一网通支付时需要一个sign签名字段,签名内容是reqData内容,定义一个签名函数

//签名
function make_sign($mer_key,$str){$reqData = arraySort($str);$signStr = createLinkString($reqData);$signStr .= '&'.$mer_key;
//SHA-256签名$baSrc = mb_convert_encoding($signStr,"UTF-8");$baResult = hash('sha256', $baSrc);
//转为16进制字符串(可选)
//$sign = bin2hex($baResult);return $baResult;
}

1.一网通支付中H5类型,可能用到的接口有3个,获取公钥接口、一网通下单接口、查询订单接口

//一网通获取公钥地址(测试)
$QueryKeyAPI_test = 'http://mobiletest.cmburl.cn/CmbBank_B2B/UI/NetPay/DoBusiness.ashx';
//一网通下单地址(测试)
$OneCardPayAPI_test = 'http://121.15.180.66:801/netpayment/BaseHttp.dll?MB_EUserPay';
//$OneCardPayAPI_test ='http://paytest.cmburl.cn:801/netpayment/BaseHttp.dll?MB_EUserPay';
//查询订单
$DoBusiness_test = 'http://121.15.180.66:801/netpayment_directlink_nosession/BaseHttp.dll?QuerySingleOrder';

2.获取公钥目的套用一网通自己的话:使用招行公钥验签(用于对“成功签约结果通知”和“成功支付结果通知”接收到的通知报文进行验签)
(1)公钥获取的数组

$pub_get_data = ['version'  => '1.0','charset'  => 'UTF-8','signType' => $config['sign_type'],'reqData'  => ['dateTime'   => date('YmdHis', $nowTime),'txCode'     => 'FBPK','branchNo'   => $config['branch_no'],'merchantNo' => $config['mch_id'],],];

公钥获取方式可以直接采用CURL方式获取。
对reData内容进行签名,Json后然后放入jsonRequestData字段:

$baResult = make_sign($config['mer_key'],$pub_get_data['reqData']);
$pub_get_data['sign']=$baResult;
$formParams['jsonRequestData']=json_encode($pub_get_data, JSON_UNESCAPED_UNICODE);

最后采用Curl请求,获取公钥。(go_curl函数文章后面提供)

go_curl($QueryKeyAPI_test,'POST',$formParams);

2.提交订单(一网通支付)
订单结构:

$tradeNo = time() . rand(1000, 9999);
$timeExpire = "30";
//数据结构
$pay_get_data = ['version'  => '1.0','charset'  => 'UTF-8','signType' => $config['sign_type'],'reqData'  => ['dateTime'         => date('YmdHis', $nowTime),'branchNo'         => $config['branch_no'],'merchantNo'       => $config['mch_id'],'date'             => date('Ymd',  $nowTime),'orderNo'          => $tradeNo,'amount'           => "0.01", // 固定两位小数,最大11位整数'expireTimeSpan'   => $timeExpire,'payNoticeUrl'     => $config['notify_url'],//'payNoticePara'    =>  '','returnUrl'        => $config['return_url'],//'clientIP'         =>  '',//'cardType'         => $config['limit_pay'], // A:储蓄卡支付,即禁止信用卡支付// 'agrNo'            => '',// 'merchantSerialNo' =>  '',//'userID'           => '',// 'mobile'           =>  '',// 'lon'              => '',// 'lat'              => '',// 'riskLevel'        => '','signNoticeUrl'    => $config['sign_notify_url'],// 'signNoticePara'   =>  '',],];

注释部分不是必填的,具体参考一网通官方接口说明。
获取请求报文:

$baResult1 = make_sign($config['mer_key'],$pay_get_data['reqData']);
$pay_get_data['sign']=$baResult1;
$formParams1['charset'] = 'UTF-8';
$formParams1['jsonRequestData']=json_encode($pay_get_data);

这里和取得公钥的方法不太一样,需要直接采用form表单的方式提交跳转(可使用js自动提交)

<form action="<?php echo $OneCardPayAPI_test?>" method="post" />
<input type="hidden" name="jsonRequestData" value='<?php echo $formParams1['jsonRequestData']?>' />
<input type="hidden" name="charset" value='UTF-8' />
<input type="submit" value="提交订单">
</form>

结构无误的情况下,提交后自动跳转支付页面。
3.查询订单

$reqData = ['dateTime' => date('YmdHis', $nowTime),'branchNo' => $config['branch_no'],'merchantNo' => $config['mch_id'],'date' => date('Ymd',  time()),'type' => 'B',// 'bankSerialNo' => '','orderNo' => $tradeNo
];
$baResult2 = make_sign($config['mer_key'],$reqData);$jsonRequestData = ['version'  => '1.0','charset'  => 'UTF-8','signType' => $config['sign_type'],'sign' => $baResult2,'reqData' => $reqData
];$formParams2['charset'] = 'UTF-8';
$formParams2['jsonRequestData']=json_encode($jsonRequestData);

查询订单采用Type中的B类型,商户自己的订单编号,这里需要注意的是,如果要查询真实(测试)订单时,需要订单编号orderNo和支付时间date完全正确哦,如你查询今天的订单号,用了昨天的时间那就会查不到。(测试报告需要 查询1给正确订单和1个失败订单)

注意事项:
‘branch_no’ => ‘xxxx’, // 商户分行号,4位数字 ‘mch_id’ => ‘xxxx’, // 商户号,6位数字 ‘mer_key’ => ‘1234567890123456’, // 秘钥16位,包含大小写字母 数字
这3个参数需要联系一网通获取,服务器ip需要过一网通白名单ip,否则无法测试成功哦
关于测试报告:
招行一网通主要测试项目有4个,正常这4个测试通过(H5支付商户测试验收报告),就可以申请正式账号了。 分别是: CMB_test003CMB_test004 和 CMB_test008CMB_test009
3和4分别通过步骤2 提交2个订单,分别用储蓄卡和信用卡进行提交(一网通提供测试卡号)。 8输入3或4提交通过的订单,查询返回并截图。 9输入任意不存在订单号,截图就可以了

附录:
go_curl函数

//提交
function go_curl($url, $type, $data = false, &$err_msg = null, $timeout = 20, $cert_info = array())
{$type = strtoupper($type);if ($type == 'GET' && is_array($data)) {$data = http_build_query($data);}$option = array();if ( $type == 'POST' ) {$option[CURLOPT_POST] = 1;}if ($data) {if ($type == 'POST') {$option[CURLOPT_POSTFIELDS] = $data;} elseif ($type == 'GET') {$url = strpos($url, '?') !== false ? $url.'&'.$data :  $url.'?'.$data;}}$option[CURLOPT_URL]            = $url;$option[CURLOPT_FOLLOWLOCATION] = TRUE;$option[CURLOPT_MAXREDIRS]      = 4;$option[CURLOPT_RETURNTRANSFER] = TRUE;$option[CURLOPT_TIMEOUT]        = $timeout;//设置证书信息if(!empty($cert_info) && !empty($cert_info['cert_file'])) {$option[CURLOPT_SSLCERT]       = $cert_info['cert_file'];$option[CURLOPT_SSLCERTPASSWD] = $cert_info['cert_pass'];$option[CURLOPT_SSLCERTTYPE]   = $cert_info['cert_type'];}//设置CAif(!empty($cert_info['ca_file'])) {// 对认证证书来源的检查,0表示阻止对证书的合法性的检查。1需要设置CURLOPT_CAINFO$option[CURLOPT_SSL_VERIFYPEER] = 1;$option[CURLOPT_CAINFO] = $cert_info['ca_file'];} else {// 对认证证书来源的检查,0表示阻止对证书的合法性的检查。1需要设置CURLOPT_CAINFO$option[CURLOPT_SSL_VERIFYPEER] = 0;}$ch = curl_init();curl_setopt_array($ch, $option);$response = curl_exec($ch);$curl_no  = curl_errno($ch);$curl_err = curl_error($ch);curl_close($ch);// error_logif($curl_no > 0) {if($err_msg !== null) {$err_msg = '('.$curl_no.')'.$curl_err;}}return $response;
}

以上代码可以Gitee上下载,地址:一网通H5支付测试Demo
如果对您有帮助,麻烦给个Star吧,谢谢!

招商银行一网通H5接口调试和测试报告撰写注意事项相关推荐

  1. 钉钉H5微应用开发免登以及接口调试

    钉钉H5微应用开发以及接口调试 企业内部应用免登 https://open.dingtalk.com/document/orgapp-server/enterprise-internal-applic ...

  2. Android平台招商银行“一网通”支付对接采坑记

    公司最近的App中需要做支付功能,支付中需要支持微信支付.支付宝支付.一网通支付.本文主要记录在对接Android平台中的"一网通"过程中遇到的坑,如果有类似需求的朋友,可供你参考 ...

  3. 招商银行一网通支付(php接入招商银行一网通支付)

    接入招商银行的目的,可以得到银行的补贴.生活中我在商城停车扫码付费时,可以选择招商银行一网通支付,停车费8元,可以随机减1到3元.补贴是银行设置的,是银行处理的,不需要商户操作(这点做的很好,比其它银 ...

  4. 接口调试神器:Postman 从入门到进阶教程(万字

    postman是一款支持http协议的接口调试与测试工具,其主要特点就是功能强大,使用简单且易用性好 . 无论是开发人员进行接口调试,还是测试人员做接口测试,postman都是我们的首选工具之一 . ...

  5. 接口结构_适用于Mac系统的API接口调试应用

    Apifox 中文版是一款适用于 Mac 的API接口调试应用.官方介绍 Apifox = Postman + Swagger + Mock.Apifox 可以用于接口文档.接口调试.Mock.自动化 ...

  6. java接口调试思想

    对于接口调试的理解: 最近多次参与接口调试工作,一般情况都是获取对方接口文档,文档中有加密验证方式,根据加密验证方式开发,调用对应的接口. 可以不可以简化这个流程那,至少减少一方的工作量. 1.减少调 ...

  7. rap2检测哪些接口在使用_Apifox for Mac(接口调试管理工具)

    Apifox 是一款用于接口文档定义.Mock 数据.接口自动化测试等等方面的工具,它的功能高效好用,接口云端同步,实时更新.成熟的团队/项目权限管理,满足各类企业的需求.有需要的朋友赶快来使用吧! ...

  8. 抓包工具Stream之接口调试和加密解码(二)

    移动端iphone抓包调试神器-Stream安装和使用(一) 之前我们介绍了Stream工具的安装和使用,今天我们再来介绍下抓包请求筛选.接口详情.接口导出.接口调试.接口测试.编码解码加密等 1.抓 ...

  9. 调试工具_Apifox for Mac(接口调试管理工具)

    Apifox 是一款用于接口文档定义.Mock 数据.接口自动化测试等等方面的工具,它的功能高效好用,接口云端同步,实时更新.成熟的团队/项目权限管理,满足各类企业的需求.有需要的朋友赶快来下载使用吧 ...

最新文章

  1. AI 识别抑郁症正确率高达八成,但AI+精神健康还有很长的路要走
  2. python自学入门教程-Python自学入门基础教程-数据类型
  3. oracle12c默认字符集,修改Oracle【12C】字符集
  4. C++程序的执行过程
  5. linux学习笔记-第六课-/etc/passwd,/etc/shadow,useradd,su,sudo等
  6. 图像语义分割的前世今生
  7. java重写6,java重写equals()方法和hashCode()方法
  8. 简单利用HTTP中的PUT协议拿下SHELL
  9. ASP.NET 2.0中实现模板中的数据绑定
  10. Scrum立会报告+燃尽图(Final阶段第二次)
  11. 使得电脑成为通用计算机器,为什么电脑显示器变成通用非即插即用监视器?
  12. 【小程序】前端微信授权登录
  13. 第三方支付平台-框架介绍
  14. Win10正式版Guest来宾账户开启使用方法
  15. 关于运算放大器电流流向的问题
  16. 华为手机设置页面黑色_华为手机微信猫和老鼠主题皮肤怎么设置 ?超个性主题等你来设置!...
  17. 七夕节 看到许多停止更新的blog 莫名有点淡淡的忧桑
  18. uniapp之登录(短信验证码,账号密码,第三方登录)
  19. document的用法
  20. 汽车ABS防抱死系统设计

热门文章

  1. Android 4.4(KitKat)窗口管理子系统 - 体系框架
  2. 微信小程序之分享海报生成
  3. 常用机器视觉软件介绍
  4. 如何把微信删除的聊天记录恢复?试试这两个简单有效的方法
  5. 您只能在Photoshop CS4中做的3酷技巧
  6. webstorm2020背景和字体_怎么为WebStorm更换主题 修改字体样式
  7. 美国出台商用无人机新规,宝宝表示我也要去考无人机飞行员驾照
  8. 语雀可以导出html吗,工具 - Confluence 迁移到语雀 - 《语雀使用文档》 - 书栈网 · BookStack...
  9. docker 运行 web 服务和部署 Go web app
  10. ios微信组件跳转_IOS如何从微信中跳转APP