使用php开发建行数字人民币DCEP小程序支付接口

发布于 2022-01-29 12:53:12

数字人民币介绍

数字人民币,英文简称DCEP,就是digital currency(数字货币)和electronic payment(电子支付)。中国发行的官方数字货币,国家信用背书,受法律承认,谁要是不认这个,那就是在搞事情,是要负法律责任滴。与支付宝、微信支付的区别就是后者是支付渠道,想获得真金白银的提现到银行卡然后取出,而数字人民币本身就是真金白银,不用提现。

项目起因

为了适应国家提出的数字人民币的普及化要求,各大银行开始对接和推广数字人民币的使用,本次要求在现有小程序商城的支付基础上新增“数字人民币”支付模式,建行本身提供了独立的数字人民币支付小程序,所以只要将该小程序接入原有支付体系即可。技术不说话干货搞起来。

如何使用php开发建行数字人民币DCEP小程序支付接口

  1. 获得建行接口关键参数和密钥。
    首先是与银行联系开通相关账户,然后由银行提供主要参数包括:MERCHANTID【商户代码】,POSID【商户柜台代码】,BRANCHID【分行代码】。还有接口公钥,这个需要在建行商户官网平台登录后获得。

    登录商户平台需要先申请证书,登录建行网站,下载“新版E路护航”,安装后根据提示完成操作,获得商户平台登录证书。
    公钥获取的是商户服务平台/数字人民币板块的公钥,而不是总平台公钥。这两者是有区别的。
    同时在服务平台还需填写支付回调地址信息,便于处理支付结果回调通知。
  2. 构建建行数字人民币支付网关下单参数
    在小程序支付前,我们需要构建网关下单的参数链,最终提交时结构如下:
    $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附加到请求参数串上使用。
  3. 跳转到“建行数字人民币支付小程序”进行支付

    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);
        }
    })
  4. 处理支付结果异步通知。
    异步通知最关键的一点就是进行数据验签,检查来源的合法性,之后进行订单号和支付金额的对比验证,最后完成订单状态的变更。

    这里主要将验签的关键步骤。
    $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天天改,头发日日疏,码字不易,如果有帮助到你,就点击"下方感谢"支持一下把.

©声明:本站所有文章,如无特殊说明或标注,均为izhnagbo.cn原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。本文链接 https://izhangbo.cn/article/51.html
0 条评论

学习
记录

发布
问题