SpringBoot通联支付接口实现案例之Httpclient(后端篇)

首先需要两个一个

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>

这个是用来转换JSON格式的,不需要可以不引入

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.75</version>
            <scope>compile</scope>
        </dependency>

首先,看看前端传过来的数据(订单号和随机字符串我直接用前端生成了)

    form: {
        cusid: "990581007426001", // 商户号
        appid: "00000051",  // 应用ID
        trxamt: "1",  // 交易金额
        reqsn: "",  // 订单号
        paytype: "U01", // 交易方式, 微信支付
        randomstr: "", // 随机字符串
        signtype: "SM2", // 签名方式
        version: "11",
        sign: null,

        orgid: null,
        body: null,
        remark: null,
        validtime: null,
        acct: null,
        notify_url: null,
        limit_pay: null,
        sub_appid: null,
        goods_tag: null,
        benefitdetail: null,
        chnlstoreid: null,
        subbranch: null,
        extendparams: null,
        cusip: null,
        front_url: null,
        idno: null,
        truename: null,
        asinfo: null,
        fqnum: null,
        terminfo: null,
        operatorid: null
      }

(其实也不需要这么多空参数,只需要把非空的传过来就行,这也是后端对应是实体类或QO)

然后,是后端

需要先生成签名sign,文档的安全规范中有详细生成步骤(paymentQO是自己写的实体类,其中smUtil等工具类是通过下载文档中的javaDemo得到的)

// 根据ASCII码从小到大排序
            TreeMap<String, String> params = new TreeMap();

            // regin 生成sign
            for(Field item : paymentQO.getClass().getDeclaredFields()) {
                item.setAccessible(true);
                if(item.get(paymentQO) != null) {
                    params.put(item.getName(), item.get(paymentQO) + "");
//                    System.out.println("属性名:" + item.getName() + " 属性值:" +  item.get(paymentQO));
                }
            }
            StringBuilder s1 = new StringBuilder();
            for (String key : params.keySet()) {
                s1.append(key).append("=").append(params.get(key)).append("&");
            }
            s1.deleteCharAt(s1.length() - 1);

            PrivateKey privateKey = SmUtil.privKeySM2FromBase64Str(SM2PPRIVATEKEY);
            String sign = SmUtil.signSM3SM2RetBase64(privateKey, paymentQO.getAppid(), String.valueOf(s1).getBytes("UTF-8"));

            // regin end

:这里没有把sign的值放到treeMap里,你们自己加一下)

然后是发送请求到测试环境接口

因为文档中说明

 这种方式提交,所以我们编辑Content-type

具体实现,如下

CloseableHttpResponse response = null;
            CloseableHttpClient httpClient = HttpClients.createDefault();
            // 创建httppost
            HttpPost httpPost = new HttpPost("https://syb-test.allinpay.com/apiweb/unitorder/pay");
                // 设置提交方式
                httpPost.addHeader("Content-type", "application/x-www-form-urlencoded; charset=utf-8");
                // 添加参数
                List<BasicNameValuePair> nameValuePairs = new ArrayList();
                if (params.size() != 0) {
                    // 提取params中的键值对
                    Set keySet = params.keySet();
                    Iterator it = keySet.iterator();
                    while (it.hasNext()) {
                        String k =  it.next().toString();// key
                        String v = params.get(k);// value
                        nameValuePairs.add(new BasicNameValuePair(k, v));
                    }
                }
                httpPost.setEntity( new UrlEncodedFormEntity(nameValuePairs,"UTF-8"));
                // 执行http请求
                response = httpClient.execute(httpPost);
                // 获得http响应体
                HttpEntity entity = response.getEntity();
                if (entity != null) {
                    // 响应的结果
                    String content = EntityUtils.toString(entity, "UTF-8");
                    JSONObject obj = JSONObject.parseObject(content);
                    return new Response(true, obj, "200", Tools.success);
                }

最后结果图:

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值