Java 示例
此 Java 示例基于 Spring 框架,使用 RestTemplate 请求
签名类实现
java
import java.util.*;
public class Signature {
public static String sign(Map<String, Object> params, String apiToken) {
StringBuilder str = new StringBuilder(apiToken);
// 对参数按 key 升序排序
List<String> keys = new ArrayList<>(params.keySet());
Collections.sort(keys);
for (String key : keys) {
Object value = params.get(key);
if (value != null && !"".equals(value.toString()) && !"sign".equals(key)) {
str.append("&").append(key).append("=").append(value);
}
}
return md5(str.toString());
}
private static String md5(String input) {
try {
java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
byte[] messageDigest = md.digest(input.getBytes());
StringBuilder hexString = new StringBuilder();
for (byte b : messageDigest) {
String h = Integer.toHexString(0xff & b);
if (h.length() == 1) hexString.append('0');
hexString.append(h);
}
return hexString.toString();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}请求下单
以下是代收下单请求,代付请求相似
java
import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;
import java.util.*;
public class OrderRequest {
public static void main(String[] args) {
Map<String, Object> params = new HashMap<>();
params.put("mch_id", 2050); // 商户ID,从商户后台获取
params.put("trans_id", "E1763923463"); // 交易ID,你的系统订单ID,方便两边核对
params.put("channel", "bank"); // 代收通道,联系商务获取
params.put("amount", "200000.00"); // 订单金额
params.put("currency", "VND"); // 币种
params.put("callback_url", "https://api.blackhole.com"); // 回调地址
params.put("remarks", "callme"); // 下单备注,回调时原样返回
params.put("nonce", UUID.randomUUID().toString().substring(0, 8)); // 随机串
params.put("timestamp", System.currentTimeMillis() / 1000); // UNIX 时间戳
String apiToken = "0xFAKE_TOKENx0"; // API Token,从商户后台获取
params.put("sign", Signature.sign(params, apiToken));
String gateway = "http://接口域名/api/v1/mch/pmt-orders";
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Map<String, Object>> request = new HttpEntity<>(params, headers);
try {
ResponseEntity<Map> response = restTemplate.postForEntity(gateway, request, Map.class);
if (response.getStatusCode() != HttpStatus.OK) {
// todo: 调用失败处理
} else {
Map<String, Object> body = response.getBody();
if (body != null && !Objects.equals(body.get("code"), 200)) {
String reason = String.valueOf(body.get("message")); // 失败原因
// todo: 调用失败处理
} else {
// todo: 调用成功,解析参数
}
}
} catch (Exception e) {
// todo: 网络异常处理
e.printStackTrace();
}
}
}