PHP 建行生活支付

文章详细描述了如何在PHP代码中构造支付请求,包括参数定义、MAC校验和RSA加密,以及如何通过方法类实现订单推送和直接付款功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

话不多说直接上代码 里面用的的方法类在上一篇文章中提到过

 public function pay_url($order_sn, $pay_money, $goods_title)
    {
        //商户代码
        $MERCHANTID = '';
        //柜台代码
        $POSID = '';
        //分行代码
        $BRANCHID = '';
        //商户19位终端号  仅作为参数传递,不参与MAC校验
        $POSID19 = '';
        //外部平台商户号  当该字段有值时参与MAC校验,否则不参与MAC校验。
        $PLATMCTID = '';
        //订单号
        $ORDERID = $order_sn;
        //付款金额
        $PAYMENT = $pay_money;
        //币种
        $CURCODE = '01';
        //交易码
        $TXCODE = '520100';
        //备注1
        $REMARK1 = '';
        //备注2  上送YS开头的服务方编号与PLATFORMID保持一致
        $REMARK2 = '';
        //接口类型
        $TYPE = '1';
        //网关类型  默认送0
        $GATEWAY = 0;
        //客户端IP 送空值即可
        $CLIENTIP = '';
        //客户注册信息 送空值即可
        $REGINFO = '';
        //商品信息  中文需使用escape编码。建议编码前长度不超过50位
        $PROINFO = $goods_title;
        //商户URL 商户送空值即可
        $REFERER = '';
        //客户端标识
        $THIRDAPPINFO = '';
        //服务方公钥  仅作为源串参加MD5摘要,不作为参数传递
        $PLATFORMPUB = '';
        //服务方编号  	仅作为参数传递,不参与MAC校验
        $PLATFORMID = '';
        //商户公钥密文    仅作为参数传递,不参与MAC校验
        $ENCPUB = '';

        //mac需要的参数
        $mac_data = [
            'MERCHANTID' => $MERCHANTID,
            'POSID' => $POSID,
            'BRANCHID' => $BRANCHID,
//            'POSID19' => $POSID19,
            'ORDERID' => $ORDERID,
            'PAYMENT' => $PAYMENT,
            'CURCODE' => $CURCODE,
            'TXCODE' => $TXCODE,
            'REMARK1' => $REMARK1,
            'REMARK2' => $REMARK2,
            'TYPE' => $TYPE,
            'GATEWAY' => $GATEWAY,
            'CLIENTIP' => $CLIENTIP,
            'REGINFO' => $REGINFO,
            'PROINFO' => $PROINFO,
            'REFERER' => $REFERER,
            'THIRDAPPINFO' => $THIRDAPPINFO,
//            'NOTIFY_URL'=>'', //回调地址
            'PLATFORMPUB' => $PLATFORMPUB
        ];
        //拼接参数
        $mac = urldecode(http_build_query($mac_data));
        $mac_md5 = md5($mac);
        $rsa = (new Tools())->encrypt($ENCPUB);
        //请求url参数
        $url_data = [
            'MERCHANTID' => $MERCHANTID,
            'POSID' => $POSID,
            'BRANCHID' => $BRANCHID,
//            'POSID19' => $POSID19,
//            'PLATMCTID' => $PLATMCTID,
            'ORDERID' => $ORDERID,
            'PAYMENT' => $PAYMENT,
            'CURCODE' => $CURCODE,
            'TXCODE' => $TXCODE,
            'REMARK1' => $REMARK1,
            'REMARK2' => $REMARK2,
            'TYPE' => $TYPE,
            'GATEWAY' => $GATEWAY,
            'CLIENTIP' => $CLIENTIP,
            'REGINFO' => $REGINFO,
            'PROINFO' => $PROINFO,
            'REFERER' => $REFERER,
//            'NOTIFY_URL'=>'',
            'THIRDAPPINFO' => $THIRDAPPINFO,
//            'PLATFORMPUB' => $PLATFORMPUB,
            'MAC' => $mac_md5,
            'PLATFORMID' => $PLATFORMID,
            'ENCPUB' => base64_encode($rsa)
        ];
        return urldecode(http_build_query($url_data));

    }

    function phpEscape($str)
    {
        preg_match_all("/[\x80-\xff].|[\x01-\x7f]+/", $str, $r);
        $ar = $r[0];
        foreach ($ar as $k => $v) {
            if (ord($v[0]) < 128)
                $ar[$k] = rawurlencode($v);
            else
                $ar[$k] = "%u" . bin2hex(iconv("GB2312", "UCS-2", $v));
        }
        return join("", $ar);
    }


    /**
     * 推送订单
     * @ApiTitle    (推送订单)
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiParams   (name="id", type="string", required=true, description="订单ID")
     * @ApiParams   (name="goods_title", type="string", required=true, description="商品标题")
     * @ApiReturn   ({

    })
     */
    public function send_order()
    {
        //获取前端传来的参数
        $params = $this->request->param();
        //验证参数
        $validate = $this->validate($params, [
            'id|订单ID' => 'require',
            'goods_title|商品标题' => 'require',
        ]);
        if ($validate !== true) {
            $this->error($validate);
        }
        //查询订单信息
        $order_info = (new Order())->where('id', $params['id'])->find();
        $order_item_info = (new Item())->where('order_id', $order_info['id'])->find();
        $user_oauth = (new Oauth())->where('user_id', $order_info['user_id'])->find();
//        $user_oauth = (new Oauth())->where('user_id', '145361')->find();
        $goods_name = $order_item_info['goods_sku_text'] ?? $order_item_info['goods_title'];
        //拼接支付请求报文
        $param_data = [
            'CLD_HEADER' => [
                'CLD_TX_CHNL' => '',
                'CLD_TX_TIME' => date('YmdHis', time()),
                'CLD_TX_CODE' => '',
                'CLD_TX_SEQ' => 'LS' . $order_info['order_sn']   //流水号
            ],
            'CLD_BODY' => [
                'USER_ID' => $user_oauth['openid'], //客户编号 建行生活会员编号
                'ORDER_ID' => $order_info['order_sn'], //订单编号
                'ORDER_DT' => date('YmdHis', time()), //订单时间 yyyyMMddHHmmss
                'TOTAL_AMT' => $order_info['total_amount'], //订单原金额 第三方原始金额
                'PAY_AMT' => $order_info['total_fee'], //订单实际支付金额
                'DISCOUNT_AMT' => '0', //第三方优惠金额
                'ORDER_STATUS' => '0', //订单状态 0-待支付  1-支付成功 2-已过期 3-支付失败  ,4-取消
                'REFUND_STATUS' => '0', //退款状态  0-无退款  1-退款申请 2-已退款 3-部分退款
                'MCT_NM' => '海河乳品', //商户名称
                'CUS_ORDER_URL' => '建行打开的外部页面链接',
                'OCC_MCT_LOGO_URL' => $order_item_info['goods_image'],
                'GOODS_NM' => $goods_name
            ]
        ];
        $result = (new Client())->request_send($param_data, 'A3341O031');
        //判断是否推送成功
        if ($result['CLD_HEADER']['CLD_TX_RESP']['CLD_CODE'] == 'CLD_SUCCESS') {
            //拼接前端唤醒收银台参数
            $url = $this->pay_url($order_info['order_sn'], $order_info['total_fee'], $params['goods_title']);
            $this->success('url', ['payInfo' => $url]);
        } else {
            $this->error('推送信息', $result);
        }
    }

    /**
     * 直接付款
     * @ApiTitle    (直接付款)
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiParams   (name="id", type="string", required=true, description="订单ID")
     * @ApiParams   (name="goods_title", type="string", required=true, description="商品标题")
     * @ApiReturn   ({

    })
     */
    public function direct_pay()
    {
        //获取前端传来的参数
        $params = $this->request->param();
        //验证参数
        $validate = $this->validate($params, [
            'id|订单ID' => 'require',
            'goods_title|商品标题' => 'require',
        ]);
        if ($validate !== true) {
            $this->error($validate);
        }
        $order_info = (new Order())->where('id', $params['id'])->find();
        $url = $this->pay_url($order_info['order_sn'], $order_info['total_fee'], $params['goods_title']);
        $this->success('url', ['payInfo' => $url]);
    }

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值