首先需要两个一个
<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);
}
最后结果图: