完整建行支付
建行主扫支付: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); //请求URLcurl_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); //请求URLcurl_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

PHP 之建行龙支付-被扫(商家扫码客户二维码),扫码枪使用相关推荐

  1. Spring Boot电商项目57:订单模块六:【前台:生成支付二维码】接口;(支付url的拼凑;利用zxing生成二维码;二维码图片的存储;真实地址与可访问地址的转换;)

    说明: (1)本篇博客主要内容是:开发[前台:生成支付二维码]接口: (2)本篇博客需要注意的点有: ● 支付url的拼凑: ● 利用zxing生成二维码: ● 二维码图片的存储:真实地址与可访问地址 ...

  2. TCPIP远程网络电子健康码扫码设备|二维码扫码门禁机HX-QR86L-IP在校园复学防疫领域的应用

    TCPIP远程网络电子健康码扫码设备|二维码扫码门禁机HX-QR86L-IP是一款铝合金材质.带液晶显示屏,一机两用,即可做门禁读头使用,也可以做电子健康码数据采集使用.可支持静态.手机动态二维码识别 ...

  3. 扫码普通二维码跳转微信小程序指定页面(体验服和开发服跳转链接不能动态传参)

    好久不见,时隔多年我又来记录问题来了,记录这次问题的主要原因是减少你我去搜索资源的时间,下面开始讲讲我越到的问题.(下面说的是针对小程序体验版或者开发版哈,正式环境不存在这个问题) 需求:pc端扫码登 ...

  4. delphi Mercadopago阿根廷支付(支持获取账户信息和余额、创建商店,商店查询、创建二维码、二维码查询、创建订单、订单查询、订单退款)

    下载链接:https://download.csdn.net/download/liushenglin123/11435379 [delphi Mercadopago阿根廷支付]支持获取账户信息和余额 ...

  5. 浅析IM即时通讯开发之扫码登录二维码

    二维码技术使用起来很简单,本系列的前三篇文章也专门针对IM扫码登录这个功能做了详细的分享,但本着学习技术不留死角的习惯,我认为有必要单独学习一下到底什么是二维码(说不定哪天被个刚入行的程序员轻轻一句& ...

  6. uniapp 扫码识别(一维码、二维码)

    注:需开启扫码功能,首先要在manifest.json配置中打开APP模块配置中 Barcode(扫码).Camera&Gallery(相机和相册) 自带扫码插件:uni.scanCode(O ...

  7. 为什么商家有了收款二维码还要使用聚合支付?

    随着移动支付的普及和兴起,许多公司和企业响应时代的需要,纷纷接入移动聚合支付.然而,一些公司和企业并没有突破传统的逻辑思维模式.他们觉得自己用的是自己的收款二维码,根本不需要使用聚合支付.今天,我将告 ...

  8. 微信扫码支付功能(1)---通过谷歌二维码工具生成付款码

    生成付款二维码 一.微信网站扫码支付介绍 1.扫码支付文档 微信开发官方文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5 ...

  9. Kotlin高仿微信-第35篇-支付-二维码收款(二维码)

      Kotlin高仿微信-项目实践58篇详细讲解了各个功能点,包括:注册.登录.主页.单聊(文本.表情.语音.图片.小视频.视频通话.语音通话.红包.转账).群聊.个人信息.朋友圈.支付服务.扫一扫. ...

  10. Flutter高仿微信-第22篇-支付-二维码收款(二维码)

    Flutter高仿微信系列共59篇,从Flutter客户端.Kotlin客户端.Web服务器.数据库表结构.Xmpp即时通讯服务器.视频通话服务器.腾讯云服务器全面讲解. 详情请查看 效果图: 实现代 ...

最新文章

  1. 【软件工程实践】结对项目-四则运算 “软件”之升级版
  2. 云上快报 | 分布式架构引领核心系统架构转型新趋势
  3. asp.net生成高质量缩略图通用函数(c#代码),支持多种生成方式
  4. linux(centos) NET模式网络配置
  5. 一个封装了的选项卡效果js
  6. dpdk大页内存实现
  7. 190124每日一句
  8. js css 实现进度条,css+js实现圆形进度条
  9. ps基础学习:渐变工具制作倒影效果
  10. ADSL拨号代理服务器实现HTTP代理的搭建过程
  11. Golang内存分配逃逸分析
  12. 奥西450的服务器系统,奥西TDS450驱动
  13. Flutter--高德地图使用指南
  14. Axure9.0---输入文字时文本框提示消失
  15. Python基于Django航空飞机票预定网站设计
  16. android studio导入第三方库引发的问题和解决方法
  17. 【FreeRTOS】
  18. vFW虚拟防火墙部署实战
  19. 统计之 - 独立性检验
  20. C++时间与日期及相关操作

热门文章

  1. 中国大陆新身份证号码算法
  2. CC2530串口中断接收字符并且判断
  3. Android柠檬水面试题,柠檬水的饮料摊(面试案例)
  4. 如何用Excel绘图好看的折线图
  5. 如何让自己成为一个优秀的Java架构师,而不是码农
  6. php 如何移动文件,php怎样移动文件
  7. vmware esxi 资源池详解
  8. SpringBoot+Editormd实现markdown文本编辑和图片上传
  9. js监听移动端手机横竖屏事件
  10. Visual Studio Code设置自定义背景图片