话不多说直接上代码 里面用的的方法类在上一篇文章中提到过
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]);
}