• 对接建行支付


                  前两篇文章介绍了对接微信支付和农行支付的方法,这篇文章介绍一下建行支付。

    使用场景:

            在微信公众号中调用微信付款,或者公众号内页面调用龙支付或者H5页面支付。

    一、微信支付

            参考建行给的接口文档

     交易流程如下:

     按照接口要求拼接参数之后,使用post方式提交参数到https://ibsbjstar.ccb.com.cn/CCBIS/ccbMain?CCB_IBSVersion=V6,示例代码如下:

    1. public Map ccbWxOrder(String orderNo, String openId, String totalFee, String body) {
    2. try {
    3. //请求建行平台
    4. String url = URL + "&" + getPayRequestStr(orderNo, NumberUtil.roundStr(Double.parseDouble(totalFee) / 100, 2), openId, body, "wx");
    5. String post = HttpRequest.post(url).execute().body();
    6. System.out.println("建行微信下单步骤1:" + post);
    7. Map map = JsonHelper.jsonToBean(Map.class, post);
    8. if ("true".equals(map.get("SUCCESS"))) {
    9. //请求成功
    10. String payUrl = map.get("PAYURL");
    11. System.out.println("payUrl:" + payUrl);
    12. String s = HttpClientUtil.get(payUrl);
    13. System.out.println("建行微信下单请求步骤2:" + s);
    14. Map result = JsonHelper.jsonToBean(Map.class, s);
    15. if ("000000".equals(result.get("ERRCODE"))) {
    16. //下单成功
    17. return result;
    18. } else {
    19. log.info("建行微信支付下单接口二阶段请求失败,原因:{}", result.get("ERRMSG"));
    20. }
    21. } else {
    22. //请求失败
    23. log.info("建行微信支付下单接口一阶段请求失败");
    24. }
    25. } catch (Exception e) {
    26. log.error("建行微信请求下单异常:{}", e);
    27. }
    28. return new HashMap<>();
    29. }

    1. //拼接请求参数,上面是微信下单接口参数,下面是龙支付h5请求参数
    2. public String getPayRequestStr(String orderId, String money, String openId, String body, String type) {
    3. String str = "";
    4. if ("wx".equals(type)) {
    5. str = "MERCHANTID=" + MERCHANTID + "&POSID=" + POSID + "&BRANCHID=" + BRANCHID + "&ORDERID=" + orderId + "&PAYMENT="
    6. + money + "&CURCODE=01&TXCODE=530590&REMARK1=&REMARK2=&TYPE=1&PUB=" + PUB.substring(PUB.length() - 30) +
    7. "&GATEWAY=0&CLIENTIP=39.101.1.11®INFO=&PROINFO=" + "&REFERER=&TRADE_TYPE=JSAPI&SUB_APPID=" + systemConfig.getGzhAppId()
    8. + "&SUB_OPENID=" + openId;
    9. } else {
    10. str = "MERCHANTID=" + MERCHANTID + "&POSID=" + POSID + "&BRANCHID=" + BRANCHID + "&ORDERID=" + orderId + "&PAYMENT="
    11. + money + "&CURCODE=01&TXCODE=SDK005&REMARK1=&REMARK2=&TYPE=1&PUB=" + PUB.substring(PUB.length() - 30) +
    12. "&GATEWAY=0&CLIENTIP=39.101.1.11®INFO=&PROINFO=" + "&REFERER=";
    13. }
    14. String MAC = MD5Helper.MD5Encode(str);
    15. return str.replaceAll("&PUB=" + PUB.substring(PUB.length() - 30), "") + "&MAC=" + MAC;
    16. }

    接收返回参数如下,按照要求就可以调起微信支付控件进行支付了。

     二、建行龙支付H5

            这个很简单,示例代码如下:

    1. public String ccbDragonOrder(String orderNo, String totalFee, String body) {
    2. String dragonUrl = URL + "&" + getPayRequestStr(orderNo, NumberUtil.roundStr(Double.parseDouble(totalFee) / 100, 2), null, body, "dragon");
    3. System.out.println(dragonUrl);
    4. return dragonUrl;
    5. }

    拿到接口的url直接访问就行了。注意,H5龙支付需要建行设置商户白名单,否则就是这样

     三、建行支付回调

            首先需要在建行商户后台设置通知地址(具体路径:商户服务平台-服务管理-实时反 馈地址修改)。建行会对返回参数进行数字签名,商户接收到建行发送的商户通知后,需要对接收到的参数数据进行数字签名的验签。建行有SDK提供(netpay.jar)。示例代码如下:

    1. @RequestMapping(value = "/ccb.api")
    2. public void ccbNotify(@RequestBody String str){
    3. System.out.println("-------接收到建行回调信息------"+str);
    4. commonPayService.ccbNotify(str);
    5. }
    1. public void ccbNotify(String str) {
    2. String now = DateUtil.now();
    3. //签名校验
    4. String[] split = str.split("&SIGN=");
    5. String src = split[0];
    6. String sign = split[1];
    7. RSASig rsaSig = new RSASig();
    8. rsaSig.setPublicKey(PUB);
    9. boolean b = rsaSig.verifySigature(sign, src);
    10. if (b) {
    11. //签名验证成功
    12. Map map = new HashMap<>();
    13. Arrays.stream(src.split("&")).map(s -> s.split("=")).filter(v -> v.length > 1).forEach((m) -> map.put(m[0], m[1]));
    14. //商户柜台代码
    15. String posId = map.get("POSID");
    16. //分行代码
    17. String branchId = map.get("BRANCHID");
    18. //订单号
    19. String orderId = map.get("ORDERID");
    20. //付款金额(元转分)
    21. String payment = Double.parseDouble(map.get("PAYMENT")) * 100 + "";
    22. //币种
    23. String curCode = map.get("CURCODE");
    24. //账户类型
    25. String accType = map.get("ACC_TYPE");
    26. //成功标志
    27. String success = map.get("SUCCESS");
    28. //接口类型
    29. String type = map.get("TYPE");
    30. //客户端IP
    31. String clientIp = map.get("CLIENTIP");
    32. //系统记账日期
    33. String accDate = map.get("ACCDATE");
    34. //处理订单,业务逻辑
    35. } else {
    36. log.error("建行支付回调验签失败------{}", now);
    37. }
    38. }

    四、退款、查询订单

            建行这点很变态的,订单查询和退款需要额外部署一个外联平台,大致就是发送一笔退款请求到外联平台,然后外联平台转发给建行服务器,建行服务器处理请求之后告诉外联平台,然后外联平台再通知商户,等于通过外联平台中转了一下。外联平台的部署参考:

    外联平台的一些功能在这里面都有说明的,按照要求来做就行了

  • 相关阅读:
    Windows11怎样投屏到电视上?
    源码编译安装Apache
    【MyBatis-Plus】之queryWrapper.apply用法
    中秋聊月相
    python基础—并发编程
    千万不要在方法上打断点!有坑!
    1.4 系统环境变量
    【C++】正向&逆向遍历map
    Open3D 点云配准——可视化匹配点对之间的连线
    博客系统前端页面
  • 原文地址:https://blog.csdn.net/a1029573879a/article/details/127925334