数字人民币,英文简称DCEP,就是digital currency(数字货币)和electronic payment(电子支付)。中国发行的官方数字货币,国家信用背书,受法律承认,谁要是不认这个,那就是在搞事情,是要负法律责任滴。与支付宝、微信支付的区别就是后者是支付渠道,想获得真金白银的提现到银行卡然后取出,而数字人民币本身就是真金白银,不用提现。
为了适应国家提出的数字人民币的普及化要求,各大银行开始对接和推广数字人民币的使用,本次要求在现有小程序商城的支付基础上新增“数字人民币”支付模式,建行本身提供了独立的数字人民币支付小程序,所以只要将该小程序接入原有支付体系即可。技术不说话干货搞起来。
获得建行接口关键参数和密钥。
首先是与银行联系开通相关账户,然后由银行提供主要参数包括:MERCHANTID【商户代码】,POSID【商户柜台代码】,BRANCHID【分行代码】。还有接口公钥,这个需要在建行商户官网平台登录后获得。
登录商户平台需要先申请证书,登录建行网站,下载“新版E路护航”,安装后根据提示完成操作,获得商户平台登录证书。
公钥获取的是商户服务平台/数字人民币板块的公钥,而不是总平台公钥。这两者是有区别的。
同时在服务平台还需填写支付回调地址信息,便于处理支付结果回调通知。
构建建行数字人民币支付网关下单参数
在小程序支付前,我们需要构建网关下单的参数链,最终提交时结构如下:
$epay_url = https://ch5.dcep.ccb.com/CCBIS/ccbMain_XM?CCB_IBSVersion=V6&MERCHANTID=105002653991975&POSID=042166601&BRANCHID=322000000&ORDERID=202201241515557833&PAYMENT=0.01&CURCODE=01&TXCODE=HT0000&REMARK1=bill&REMARK2=&RETURNTYPE=1&TIMEOUT=&MAC=daa34ac9601025550d43ec3929a06b9e&Mrch_url=https://www.baidu.com&TX_FLAG=3
各字段含义请配合建行接口文档查看和获取。其中关键的一点是MAC参数如何生成?
MAC参数生成原理:
$A = "MERCHANTID=105002653991975&POSID=042166601&BRANCHID=322000000&ORDERID=202201241515557833&PAYMENT=0.01&CURCODE=01&TXCODE=HT0000&REMARK1=bill&REMARK2=&RETURNTYPE=1&TIMEOUT="; //根据接口文档将需要加密的参数进行组合
$B = substr($PUBKEY,-30); //公钥的后30位B。
$MAC = md5($A.'&PUB='.$B); //MD5加密获得mac
最后将$MAC附加到请求参数串上使用。
wx.navigateToMiniProgram({
appId: "建行支付小程序appid",
path: "pages/home/home?time:"+(Date.now()),
extraData: {
URL: encodeURI(epay_url)
},
envVersion: "release",
success: function(e) {
console.log('成功启动支付小程序',e);
},
error: function(e) {
console.log('打开支付小程序失败');
},
complete: function(e) {
console.log(e);
}
})
处理支付结果异步通知。
异步通知最关键的一点就是进行数据验签,检查来源的合法性,之后进行订单号和支付金额的对比验证,最后完成订单状态的变更。
这里主要将验签的关键步骤。
$data = [
'POSID'=>$param['POSID'],
'BRANCHID'=>$param['BRANCHID'],
'ORDERID'=>$param['ORDERID'],
'PAYMENT'=>$param['PAYMENT'],
'CURCODE'=>$param['CURCODE'],
'REMARK1'=>$param['REMARK1'],
'REMARK2'=>$param['REMARK2'],
'ACC_TYPE'=>$param['ACC_TYPE'],
'SUCCESS'=>$param['SUCCESS'],
];
if(isset($param['TYPE'])){
$data['TYPE'] = $param['TYPE'];
}
if(isset($param['REFERER'])){
$data['REFERER'] = $param['REFERER'];
}
if(isset($param['CLIENTIP'])){
$data['CLIENTIP'] = $param['CLIENTIP'];
}
if(isset($param['ACCDATE'])){
$data['ACCDATE'] = $param['ACCDATE'];
}
$sign_str = [];
foreach ($data as $key=>$val){
$sign_str[] = $key.'='.$val;
}
$sign_str = implode('&',$sign_str);
$sign = $param['SIGN'];
$aes = new \Java('CCBPayUtil');
$check_sign_res = $aes->verifyNotifySign($sign_str,$sign,$PUBKEY); //$PUBKEY为完整的公钥,这里使用了建行提供的Java验签工具包函数
if($check_sign_res){
if($param['SUCCESS'] === 'Y'){
//更新订单信息
}
echo 'success';
}else{
echo 'fail';
}
这样主要流程就搞定了,其他的还有订单结果主动查询、订单退款等操作可以结合文档深入开发。更多问题可通过QQ与我取得联系。
Bug天天改,头发日日疏,码字不易,如果有帮助到你,就点击"下方感谢"支持一下把.