完整建行支付
建行主扫支付:https://blog.csdn.net/weixin_42674576/article/details/122010126?spm=1001.2014.3001.5501
被扫支付查单:https://blog.csdn.net/weixin_42674576/article/details/122380365?spm=1001.2014.3001.5501
退款:https://blog.csdn.net/weixin_42674576/article/details/122428305
这里和主扫稍微有些改动,改动不大,不影响
首先配置如下:
<?php
return [
'bankUrl' => 'https://ibsbjstar.ccb.com.cn/CCBIS/ccbMain',
//公共配置
'public' => [
'merchant_id' => '', //商户代码
'pos_id' => '', //商户柜台代码
'branch_id' => '', //分行代码
'pub_key' => '' //商户公钥
],
//被扫
'bePay' => [
'ccbParam' => '', //加密串
'tx_code' => 'PAY100', //交易码
'mer_flag' => '1', //商户类型,1:线上商户2:线下商户
]
];
被扫服务类
<?php
namespace service\ccb;
use app\util\HttpUtil;
class BePayService
{
// 请求接口域名
const HOST = 'https://ibsbjstar.ccb.com.cn/CCBIS/B2CMainPlat_00_BEPAY';
const MD5KEY = '20120315201809041004';
//被扫
public function bePay($input){
$param = config('ccb.bePay');
$publicParam = config('ccb.public');
//测试使用,线上删除----↓↓↓↓↓↓↓↓------
$input['order'] = substr($publicParam['merchant_id'],strlen($publicParam['merchant_id']) - 9,'9').date('YmdHis').rand(10000,99999);
//测试使用,线上删除----↑↑↑↑↑↑↑↑------
$data = [
'MERCHANTID' => $publicParam['merchant_id'], // 商户号
'POSID' => $publicParam['pos_id'], // 柜台号
'BRANCHID' => $publicParam['branch_id'], // 分行号
'GROUPMCH' => '', // 集团商户信息
'TXCODE' => $param['tx_code'], //交易码
'MERFLAG' => $param['mer_flag'], //商户类型,1:线上,2:线下
'TERMNO1' => '', //终端编号1
'TERMNO2' => '', //终端编号2
'ORDERID' => $input['order'],
'QRCODE' => $input['code'],
'AMOUNT' => $input['payment'],
'PROINFO' => '', //商品名称
'REMARK1' => '', //备注 1
'REMARK2' => '', //备注 2
'FZINFO1' => '', //分账信息1
'FZINFO2' => '', //分账信息2
'SUB_APPID' => '', //子商户公众账号 ID
'RETURN_FIELD' => '', //返回信息位图0 或空-不返回,1-返回。
'USERPARAM' => '', //实名支付
'detail' => '', //商品详情
'goods_tag' => '', //订单优惠标记
];
$content = date('Y-m-d H:i:s').'——方式:被扫,订单:'.$input['order'].',金额:'.$input['payment'].',码信息:'.$input['code']."\n";
file_put_contents('付款订单记录', $content,FILE_APPEND);
// 计算签名
$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;
}
}
请求类
<?php
namespace app\util;
/**
* HTTP辅助
*/
class HttpUtil
{
//默认客户端标识
private static $USER_AGENT = 'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0';
/**
* GET
* @param string $url 地址
* @param array $param 参数
* @param string $config 更多配置 [header|format]
* @return string|array 响应内容
*/
public static function get($url, $param = [], $config = [])
{
//拆分锚数据
if (strpos($url, '#') > 0) {
list($url, $anchor) = explode('#', $url);
}
//地址组合处理
if (strpos($url, '?') === false) {
$url = $url . '?' . http_build_query($param);
} else {
$url = $url . '&' . http_build_query($param);
}
//附加锚信息
if (isset($anchor)) $url = $url . '#' . $anchor;
$header = isset($config['header']) ? $config['header'] : [self::$USER_AGENT]; //默认请求头
$format = isset($config['format']) ? $config['format'] : 'JSON'; //输出格式
$ch = curl_init(); //初始化
curl_setopt($ch, CURLOPT_URL, $url); //请求URL
curl_setopt($ch, CURLOPT_HEADER, false); //是否响应头信息
curl_setopt($ch, CURLOPT_HTTPHEADER, $header); //请求头信息
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //不直接输出结果
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); //请求方法
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //验证对等证书
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); //验证主机
//SSL配置
if (isset($config['ssl'])) {
foreach ($config['ssl'] as $key => $value) {
curl_setopt($ch, constant('CURLOPT_' . $key), $value);
}
}
//请求资源内容
$response = curl_exec($ch);
//获取请求错误信息
$error = curl_error($ch);
//释放对象
curl_close($ch);
//异常处理
if ($error) {
trace($error, 'httputil');
}
trace("HTTP_GET_RESPONSE:".$response);
if ('JSON' == $format) {
return json_decode($response, true);
} else {
return $response;
}
}
/**
* POST
* @param string $url 地址
* @param array|string $param 参数
* @param string $config 更多配置 [header|format]
* @return string 响应内容
*/
public static function post($url, $param = [], $config = [])
{
$header = isset($config['header']) ? $config['header'] : [self::$USER_AGENT]; //默认请求头
$format = isset($config['format']) ? $config['format'] : 'JSON'; //输出格式
$ch = curl_init(); //初始化
curl_setopt($ch, CURLOPT_URL, $url); //请求URL
curl_setopt($ch, CURLOPT_HEADER, false); //是否响应头信息
curl_setopt($ch, CURLOPT_HTTPHEADER, $header); //请求头信息
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //不直接输出结果
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); //请求方法
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //验证对等证书
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); //验证主机
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
//SSL配置
if (isset($config['ssl'])) {
foreach ($config['ssl'] as $key => $value) {
curl_setopt($ch, constant('CURLOPT_' . $key), $value);
}
}
//请求资源内容
$response = curl_exec($ch);
//获取请求错误信息
$error = curl_error($ch);
//释放对象
curl_close($ch);
//异常处理
if ($error) {
trace($error, 'httputil');
return false;
}
trace("HTTP_POST_RESPONSE:".$response);
if ('JSON' == $format) {
return json_decode($response, true);
} else {
return $response;
}
}
}
以上配置完成后,我们只需要在$input中传入参数:
payment(订单金额),
order(订单号),
code(一维码,二维码信息)即可
测试,扫码支付宝付款码效果
支付完成后,再次查询订单是否支付成功:https://blog.csdn.net/weixin_42674576/article/details/122380365?spm=1001.2014.3001.5501