完整建行支付 建行主扫支付:https://blog.csdn.net/weixin_42674576/article/details/122010126?spm=1001.2014.3001.5501 建行被扫支付:https://blog.csdn.net/weixin_42674576/article/details/122380110?spm=1001.2014.3001.5501 退款:https://blog.csdn.net/weixin_42674576/article/details/122428305
<?php
namespace service\ccb;
use app\util\HttpUtil;
class QueryService
{
// 请求接口域名
const HOST = 'https://ibsbjstar.ccb.com.cn/CCBIS/B2CMainPlat_00_BEPAY';
const MD5KEY = '20120315201809041004';
/**
* 支付查询 轮询订单结果-PAY101
*/
public function query($input) {
$param = config('ccb.bePay');
$publicParam = config('ccb.public');
$data = [
'MERCHANTID' => $publicParam['merchant_id'], // 商户号
'POSID' => $publicParam['pos_id'], // 柜台号
'BRANCHID' => $publicParam['branch_id'], // 分行号
'GROUPMCH' => '', // 集团商户信息
'TXCODE' => 'PAY101', // 交易码
'MERFLAG' => $param['mer_flag'], // 商户类型
'TERMNO1' => '', // 终端编号 1
'TERMNO2' => '', // 终端编号 2
'ORDERID' => $input['order'], // 订单号
'QRYTIME' => $input['qr_time'], // 查询次数 从1开始
'QRCODE' => isset($input['code']) ? $input['code'] : '', // 码信息(一维码、二维码)
'QRCODETYPE' => isset($input['code_type']) ? $input['code_type'] : '', //二维码类型 如QRCODE为空 此参数为必输,1:龙支付2:微信3:支付宝4:银联
'REMARK1' => '', // 备注 1
'REMARK2' => '', // 备注 2
'SUB_APPID' => '', // 子商户公众账号 ID
'RETURN_FIELD' => '', // 返回信息位图
];
// 与支付的区别TXCODE不一样,需要传QRYTIME,QRCODE和QRCODETYPE两个需传一个
// 后续计算签名和加密串跟支付类似
// 计算签名
$sign = $this->calSign($this->sortParams($data));
$data['SIGN'] = $sign;
// 计算加密串
$params = http_build_query($data);
$pubKey = substr($publicParam['pub_key'], -30);
$pubKey = substr($pubKey, 0, 8);
$data['ccbParam'] = $this->calCcbParam($params, $pubKey);
// 获取要请求的参数
$requestData = $this->getRequestData($data);
$url = self::HOST . '?' . http_build_query($requestData);
$httpRequest = new HttpUtil();
$res = $httpRequest::post($url);
return $res;
}
/**
* 按key升序排序,同时去掉空值
* @param $params array
* @return mixed
*/
public function sortParams($params) {
ksort($params);
foreach ($params as $key => $value) {
if (empty($value) && $value == '') {
unset($params[$key]);
}
}
return $params;
}
/**
* 计算签名
* @param $params array 不含空值
* @return string
*/
public function calSign($params) {
return md5(http_build_query($params) . self::MD5KEY);
}
/**
* 真正请求建行接口要传的参数
* @param $data array
* @return array
*/
public function getRequestData($data) {
return [
'MERCHANTID' => $data['MERCHANTID'],
'POSID' => $data['POSID'],
'BRANCHID' => $data['BRANCHID'],
'ccbParam' => $data['ccbParam'],
];
}
/**
* 计算ccbparam
* @param $params string
* @param $key string
* @return string
*/
public function calCcbParam($params, $key) {
$res = openssl_encrypt (iconv("utf-8", "utf-16", $params), 'DES-ECB', $key);
$res = str_replace('+', ',', $res);
$res = urlencode($res);
return $res;
}
}
完成后,在$input中传入参数: order:订单号 code:码信息(扫码得到的字符串) code_type:二维码类型 如未上送 QRCODE 则此参数为必输,1:龙支付2:微信3:支付宝4:银联 qr_time:查询次数,从1开始,每次+1,最高6次
被扫支付成功后,查询订单状态,接口返回如下:
|