跳转到内容

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();
        }
    }
}

Released under the MIT License.