在开发中 遇到一个对接建行支付的 我从网上搜了一下 大多数 都在吐槽文档写的垃圾 我从这里记录一下 我对接支付过程中 遇到的问题 以及解决办法从注册账号开始
一:注册账号/登陆
-
首页要找到 建行特约商户首页 第一次需要准备的东西有点多 需要下载 建行的 E路护航 不然无法登陆
流程如下 传送门 以及常见问题链接 传送门 -
第一步处理完成之后 从 特约商户入口 就可以直接登录了
点登陆之后 要有个证书 点确定就可以 然后到 商户服务平台登录 输入账号密码就可以正常登陆了
二:参数与配置
1.登陆商户服务平台之后需要配置/下载各种参数
如下:
公钥:用于下单时使用 类似与微信商户的支付密钥 (注:不能修改需要保持好)
回调/实时反馈地址
根据自己的需求来设置就可以
三:下单
参数的构建(根据建行的文档来就可以)在这里放一张
然后就是代码 我参考了一下这个大佬操作的—传送门—
//设置无需登录接口
protected $noNeedLogin = ['*'];
//商户代码 商户号
protected $MERCHANTID = '105555555555555';
//商户柜台代码 参数为 第二步 1中柜台号
protected $POSID = '0333333';
//分行代码 这里用的 山东建行
protected $BRANCHID = '370000000';
//币种
protected $CURCODE = 01;
//交易码
protected $TXCODE = 520100;
//公钥后30位
protected $PUB = '0fg88is844325njgu88lqp44020111';
/**
* Notes: 建行龙支付下单 构建参数
* By: Tommy
* DateTime: 2021/3/32 9:17
*/
public function go_pay(){
$orderNum = rand(1000,999999999);
$price = 0.01;
// 商户代码, 由建行统一分配
$MERCHANTID = $this->MERCHANTID;
// 商户柜台代码, 由建行统一分配
$POSID = $this->POSID;
// 分行代码, 由建行统一指定
$BRANCHID = $this->BRANCHID;
// 订单号, 由商户提供,最长 30 位
$ORDERID = $orderNum;
// 付款金额
$PAYMENT = $price;
// 币种 01-人民币
$CURCODE = '01';
// 交易码, 由建行统一分配为 520100
$TXCODE = '520100';
// 备注 1, 一般作为商户自定义备注信息使用,可在对账单中显示。
$REMARK1 = '';
// 备注 2, 一般作为商户自定义备注信息使用,可在对账单中显示。
$REMARK2 = '';
// 接口类型, 分行业务人员在 P2 员工渠道后台设置防钓鱼的开关。1-防钓鱼接口
$TYPE = 1;
// 公钥后 30 位, 商户从建行商户服务平台下载,截取后 30 位。仅作为源串参加 MD5 摘要,不作为参数传递
$PUB = $this->PUB;
// 网关类型, 默认送 0
$GATEWAY = 0;
// 客户在商户系统中的 IP,即客户登陆(访问)商户系统时使用的 ip
$CLIENTIP = '123.000.00.000';
// 客户在商户系统中注册的信息,中文需使用 escape 编码
$REGINFO = '';
// 客户购买的商品, 中文需使用 escape 编码
$PROINFO = '';
// 商户 URL, 商户送空值即可
$REFERER = '';
// 商户客户端的intent�filter/schema, comccbpay+商户代码+商户自定义的标示app的字符串(只能为字母或数字), 例comccbpay105320148140002alipay,
// 建行移动端文档就要求这么拼接, IOS文档却直接写取你的应用程序的URL Schemes即可, 你们自己看文档要求吧
// $THIRDAPPINFO = 'comccbpay' . $MERCHANTID. 'myAPP';
$THIRDAPPINFO = 'myAPP';
// 支付方式位图, 10位位图,1为开,0为关, 第一位:支付宝, 第二位:微信,第三位:银联支付(保留位,暂不开放)其余位数预留。例如支持支付宝和微信支付则上送1100000000该字段不参与 MAC计算
$PAYMAP = '0000000000';
// md5加密参数
$md5Params = [
'MERCHANTID' => $MERCHANTID,
'POSID' => $POSID,
'BRANCHID' => $BRANCHID,
'ORDERID' => $ORDERID,
'PAYMENT' => $PAYMENT,
'CURCODE' => $CURCODE,
'TXCODE' => $TXCODE,
'REMARK1' => $REMARK1,
'REMARK2' => $REMARK2,
'TYPE' => $TYPE,
'PUB' => $PUB,
'GATEWAY' => $GATEWAY,
'CLIENTIP' => $CLIENTIP,
'REGINFO' => $REGINFO,
'PROINFO' => $PROINFO,
'REFERER' => $REFERER,
'THIRDAPPINFO' => $THIRDAPPINFO,
// 'TIMEOUT' => ''
];
$md5Query = http_build_query($md5Params);
// MAC 校验域, 采用标准 MD5 算法
$MAC = md5($md5Query);
// 请求参数
$urlParams = [
'MERCHANTID' => $MERCHANTID,
'POSID' => $POSID,
'BRANCHID' => $BRANCHID,
'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,
'MAC' => $MAC,
// 'PAYMAP' => '0000000000'
];
$orderStr = http_build_query($urlParams);
halt($orderStr);
return [
// 我这里只是返回url需要拼接的参数, https://ibsbjstar.ccb.com.cn/CCBIS/ccbMain?加上$orderStr就是完整的商户下单请求地址
'orderStr' => $orderStr
];
}
放了一段PHP的代码 其他语言根据文档的参数来构建就可以
我在这里上传了一个建行的 下单模拟器 可以把生成的参数 或者填写参数之后 模拟下单 方便测试
传送门
四、支付回调
- 官方文档给的参数
- 回调参数 我用的转换的json格式方
{
"POSID":"052498251",
"BRANCHID":"370000000",
"ORDERID":"SP2029041256511025",
"PAYMENT":"0.01",
"CURCODE":"01",
"REMARK1":"shop",
"REMARK2":"",
"ACC_TYPE":"12",
"SUCCESS":"Y",
"TYPE":"1",
"REFERER":"",
"CLIENTIP":"60.216.214.927",
"SIGN":"18828a21de9115f62dcc9efd36542119268e9366533feebf800a3c3963f2eb95abe20c0943fb841e73d085b5d5d5a99dc87c263577def512b252b0726cede61fd047436cb0f6ca9eae47c2a6af71972eebe5bdeb063e5d0fee7d33f8ed5fdcd003900c9a490b2506cffeb62917465197ffec9b117b0cf04a1354ce305eb0cb733"
}
接受参数的时候用的 get 需要注意一下 具体的官方文档没给介绍 我用get可以接受到
其他的 包括验签之类的操作 需要自己来处理 包括 回调方法里处理订单的状态 我这里就不过多接受了
如果对你有用 一键三连