对接支付系统实战

x33g5p2x  于2021-11-11 转载在 其他  
字(9.6k)|赞(0)|评价(0)|浏览(326)

一 需求

支付平台对接,主要对接3个接口。

1 余额查询

2 批量支付

3 批量查询

二 代码

1 签名工具类 

import com.alibaba.fastjson.JSON;
import org.springframework.util.DigestUtils;

import java.util.HashMap;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;

/**
* @className: SignUtil
* @description: 签名工具类
* @date: 2021/11/1
* @author: cakin
*/
public class SignUtil {
    public static final String RM = "sign";
    public static final String APP_SECRET = "appSecret";
    private final String key = "xxxxxxxx";

    public static void main(String[] args) {
        // 签名举例
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("merchantId", "xxxxxx");
        long l = System.currentTimeMillis();
        paramMap.put("timestamp", l + "");
        System.out.println(l+"");
        String sign = SignUtil.getSign(JSON.parseObject(JSON.toJSONString(paramMap)), "afeb523441a170f8");
        System.out.println(sign);
        String str = "xxxxxx";
        System.out.println(str.substring(2,str.length()-2));
    }

    /**
     * 获取签名
     *
     * @param paramMap  包含所有业务参数,和appKey,nonce,timestamp这3个公共参数
     * @param appSecret
     * @return
     */
    public static String getSign(Map<String, Object> paramMap, String appSecret) {
        String text = getUrlText(paramMap);
        text += "&appSecret=" + appSecret;
        return DigestUtils.md5DigestAsHex(text.getBytes()).toUpperCase();
    }
    private static String getUrlText(Map<String, Object> beanMap) {
        beanMap = getSortedMap(beanMap);
        StringBuilder builder = new StringBuilder();
        for (String key : beanMap.keySet()) {
            String value = beanMap.get(key).toString();
            builder.append(key);
            builder.append('=');
            builder.append(value);
            builder.append('&');
        }
        String text = builder.toString();
        return text.substring(0, text.length() - 1);
    }
    public static Map<String, String> transMap(String str) {
        String[] key_value = str.split("&");
        Map<String, String> map = new HashMap<String, String>();
        for (String e : key_value) {
            String[] value = e.split("=");
            if(value == null || value.length != 2){
                continue;
            }
            map.put(value[0], value[1]);
        }
        return map;
    }
    /**
     * 对普通 map 进行排序
     *
     * @param paramMap
     * @return
     */
    private static Map<String, Object> getSortedMap(Map<String, Object> paramMap) {
        SortedMap<String, Object> map = new TreeMap<String, Object>();
        for (String key : paramMap.keySet()) {
            if (key != null && !APP_SECRET.equals(key) && !RM.equals(key)) {
                Object value = paramMap.get(key);
                if (value != null) {
                    String valueStr = String.valueOf(value);
                    if (valueStr != null && !"".equals(valueStr)) {
                        map.put(key, value);
                    }
                }
            }
        }
        return map;
    }
    public static String getUrlParams(Map<String, Object> beanMap) {
        StringBuilder builder = new StringBuilder();
        for (String key : beanMap.keySet()) {
            String value = "";
            if(beanMap.get(key) != null ){
                value = beanMap.get(key).toString();
            }
            builder.append(key);
            builder.append('=');
            builder.append(value);
            builder.append('&');
        }
        String text = builder.toString();
        return text.substring(0, text.length() - 1);
    }
    public Boolean signatureVerification(Map<String,Object> paramMap,String sign){
        String sign1 = SignUtil.getSign(JSON.parseObject(JSON.toJSONString(paramMap)), key);
        if(null == sign1 || !sign.equals(sign1)){
            return false;
        }
        return true;
    }
}

2 测试类

import com.alibaba.fastjson.JSON;
import com.project.common.util.hxxutil.RsaUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static com.project.common.util.HttpClientUtils.sendPostByJsonWithHeader;
import static com.project.common.util.hxxutil.RsaUtils.encrypt;

class Entity {
    private String merchantId;
    private String timestamp;
    private String sign;
    private String data;

    public String getMerchantId() {
        return merchantId;
    }

    public void setMerchantId(String merchantId) {
        this.merchantId = merchantId;
    }

    public String getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(String timestamp) {
        this.timestamp = timestamp;
    }

    public String getSign() {
        return sign;
    }

    public void setSign(String sign) {
        this.sign = sign;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }
}

//  支付个人
class PersonInfo {
    // 非必须 开户地
    String bankAddress;
    // 必须 银行卡号
    String bankCode;
    // 非必须 开户行
    String bankName;
    // 必须 创客身份证号码
    String idcardCode;
    // 必须 手机号
    String mobileCode;
    // 非必须 提现方式
    String paymentMethod;
    // 必须 提现金额
    String realMoney;
    // 必须 户名
    String workerName;

    public String getBankAddress() {
        return bankAddress;
    }

    public void setBankAddress(String bankAddress) {
        this.bankAddress = bankAddress;
    }

    public String getBankCode() {
        return bankCode;
    }

    public void setBankCode(String bankCode) {
        this.bankCode = bankCode;
    }

    public String getBankName() {
        return bankName;
    }

    public void setBankName(String bankName) {
        this.bankName = bankName;
    }

    public String getIdcardCode() {
        return idcardCode;
    }

    public void setIdcardCode(String idcardCode) {
        this.idcardCode = idcardCode;
    }

    public String getMobileCode() {
        return mobileCode;
    }

    public void setMobileCode(String mobileCode) {
        this.mobileCode = mobileCode;
    }

    public String getPaymentMethod() {
        return paymentMethod;
    }

    public void setPaymentMethod(String paymentMethod) {
        this.paymentMethod = paymentMethod;
    }

    public String getRealMoney() {
        return realMoney;
    }

    public void setRealMoney(String realMoney) {
        this.realMoney = realMoney;
    }

    public String getWorkerName() {
        return workerName;
    }

    public void setWorkerName(String workerName) {
        this.workerName = workerName;
    }
}

public class Test {
    public static void main(String[] args) throws Exception {
        // queryBalance(); // 查余额
        // batchPayment(); // 批量支付
        batchQueryPayment(); // 批量查询
    }

    public static void batchQueryPayment() throws Exception {
        String merchantId = "xxxxx554980982786";
        String appSecret = "xxxxx3441a170f8";
        String url = "http://xxxxx.wicp.vip/foreign/batchQueryOrderDetail"; // 测试
        Map<String, String> params = generateQueryParam(appSecret, merchantId);
        Map<String, String> headers = new HashMap<>();
        headers.put("Content-Type", "application/json");

        Entity entity = new Entity();
        entity.setMerchantId(params.get("merchantId"));
        entity.setTimestamp(params.get("timestamp"));
        entity.setSign(params.get("sign"));
        entity.setData("1455163868375527425");
        String apiString = JSON.toJSONString(entity);
        String result = sendPostByJsonWithHeader(url, apiString, headers);
        System.out.println(result);
    }

    public static void batchPayment() throws Exception {
        String merchantId = "xxxxx554980982786";
        String appSecret = "xxxxx3441a170f8";
        String url = "http://xxxxx.wicp.vip/foreign/batchWithdrawal";  // 测试
        Map<String, String> params = generateQueryParam(appSecret, merchantId);
        Map<String, String> headers = new HashMap<>();
        headers.put("Content-Type", "application/json");
        Entity entity = new Entity();
        entity.setMerchantId(params.get("merchantId"));
        entity.setTimestamp(params.get("timestamp"));
        entity.setSign(params.get("sign"));
        PersonInfo personInfo = new PersonInfo();
        personInfo.setBankCode("xxxxx4229999690147"); // 银行卡号
        personInfo.setIdcardCode("xxxxx"); // 身份证号码
        personInfo.setMobileCode("xxxxx"); // 手机号
        personInfo.setRealMoney("10.00"); // 提现金额
        personInfo.setWorkerName("xxx"); // 户名
        personInfo.setPaymentMethod("UNIONPABK"); // 支付方式
        List<PersonInfo> data = new ArrayList<>();
        data.add(personInfo);
        String dataString = JSON.toJSONString(data);
        // 非加密
        //entity.setData(dataString);
        // 加密
        String encryptDataString = encrypt(dataString, RsaUtils.publicKey);
        entity.setData(encryptDataString);
        String apiString = JSON.toJSONString(entity);
        String result = sendPostByJsonWithHeader(url, apiString, headers);
        System.out.println(result);
    }

    public static void queryBalance() throws Exception {
        String merchantId = "xxxxx554980982786";
        String appSecret = "xxxxx3441a170f8";
        String url = "http://xxxxx.wicp.vip/foreign/getMerchantInfoAndOnlinePaymentInfoToBY"; // 测试
        Map<String, String> params = generateQueryParam(appSecret, merchantId);
        Map<String, String> headers = new HashMap<>();
        headers.put("Content-Type", "application/json");
        Entity entity = new Entity();
        entity.setMerchantId(params.get("merchantId"));
        entity.setTimestamp(params.get("timestamp"));
        entity.setSign(params.get("sign"));
        String apiString = JSON.toJSONString(entity);
        String result = sendPostByJsonWithHeader(url, apiString, headers);
        System.out.println(result);
    }

    private static Map<String, String> generateQueryParam(String appSecret, String merchantId) {
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("merchantId", merchantId);
        long l = System.currentTimeMillis();
        String timestamp = l + "";
        paramMap.put("timestamp", timestamp);
        String sign = SignUtil.getSign(JSON.parseObject(JSON.toJSONString(paramMap)), appSecret);
        Map<String, String> params = new HashMap<>();
        params.put("merchantId", merchantId);
        params.put("timestamp", timestamp);
        params.put("sign", sign);
        return params;
    }
}

三 测试

1 余额查询

{
    "code": 200,
    "finished": false,
    "state": "success",
    "itemsCount": 0,
    "pageSize": 10,
    "obj": {
        "companyTaxPayMethodVO": [{
            "taxId": "xxxxx",
            "taxName": "xxxxx",
            "packageType": "TOTALPACKAGE",
            "paymentMethod": "UNIONPABK",
            "balance": xxxxx
        }],
        "merchantId": "xxxxx",
        "companyName": "xxxxx"
    }
}

2 批量支付10元

{
    "code": 200,
    "message": "1455163868375527425",
    "finished": false,
    "state": "success",
    "itemsCount": 0,
    "pageSize": 10
}

3 批量查询

{
    "code": 200,
    "finished": false,
    "state": "success",
    "itemsCount": 0,
    "pageSize": 10,
    "obj": {
        "orderId": "1455163868375527425",
        "paymentStatus": 2,
        "orderInfoVOList": [{
            "workerName": "xxxxx",
            "idCardCode": "xxxxx",
            "paymentStatus": 0,
            "tradeFailReason": ""
        }]
    }
}

相关文章