package com.yc.ship; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.yc.ship.module.trade.framework.common.PayDigestUtil; import com.yc.ship.module.trade.framework.common.PayUtil; import java.net.URLEncoder; import java.util.Map; /** * @author :qsl * @description:TODO * @date :2026/7/1 16:15 **/ public class RefundPayOrder { static final String mchId = "10000004"; /** * 加签key */ static final String reqKey = "M86l522AV6q613Ii4W6u8K48uW8vM1N6bFgyv769220MdYe9u37N4y7rI5mQ"; /** * 验签key */ static final String repKey = "Hpcl522AV6q613KIi46u6g6XuW8vM1N8bFgyv769770MdYe9u37M4y7rIpl8"; static final String baseUrl = "http://booking.vista-cruises.com/pay/api"; static final String notifyUrl = "http://booking.vista-cruises.com/ship-app-api/trade/payNotify"; // 本地环境测试,可到ngrok.cc网站注册 public static void main(String[] args) { payOrderTest(); // 支付下单 // refundOrderTest(); // 退款创建退单 //quryRefundOrderTest(); //查询退单 } static void payOrderTest() { JSONObject paramMap = new JSONObject(); paramMap.put("mchId", mchId); // 商户ID paramMap.put("mchOrderNo", "ZSHL"+System.currentTimeMillis()); // 商户订单号 paramMap.put("channelId", "ABC_JL_C2B"); paramMap.put("amount", 1); // 支付金额,单位分 paramMap.put("currency", "cny"); // 币种, cny-人民币 paramMap.put("clientIp", "127.0.0.1"); // 用户地址,微信H5支付时要真实的 paramMap.put("device", "WEB"); // 设备 paramMap.put("subject", "测试票,请勿购买"); paramMap.put("body", "测试票,请勿购买"); paramMap.put("notifyUrl", notifyUrl); // 回调URL paramMap.put("returnUrl", "http://172.16.121.237:8100/"); // 回调URL paramMap.put("param1", ""); // 扩展参数1 1 微信 2 支付宝 paramMap.put("param2", ""); // 扩展参数1 1 微信 2 支付宝 paramMap.put("expireTime", "1800"); // 扩展参数2 // paramMap.put("payCode", "132857771924518653"); //付款码 用户被扫必传 paramMap.put("msgType", ""); // //附加参数 paramMap.put("extra", "{\"deviceType\":\"11\",\"secretText\":\"\",\"appVersion\":\"\",\"serialNum\":\"\",\"productId\":\"558873250097004544\",\"openId\":\"otZpM10ls6fycQU3rlclCTHzw8NM\",\"latitude\":\"16.1\",\"longitude\":\"16.1\"}"); String reqSign = PayDigestUtil.getSign(paramMap, reqKey); paramMap.put("sign", reqSign); // 签名 String reqData = "params=" + paramMap.toJSONString(); System.out.println("请求支付中心下单接口,请求数据:" + reqData); long s1 = System.currentTimeMillis(); String url = baseUrl + "/pay/create_order?"; String result = PayUtil.call4Post(url + reqData); System.out.println("请求支付中心下单接口,响应数据:" + result); System.out.println("执行:"+(System.currentTimeMillis()-s1)); } static void refundOrderTest() { JSONObject paramMap = new JSONObject(); paramMap.put("mchId", mchId); // 商户ID paramMap.put("mchRefundNo", "REFUND" + System.currentTimeMillis()); // 商户订单号 paramMap.put("channelId", "ABC_JL_C2B"); paramMap.put("currency", "cny"); // 币种, cny-人民币 paramMap.put("clientIp", "127.0.0.1"); // 用户地址,微信H5支付时要真实的 paramMap.put("device", "WEB"); // 设备 paramMap.put("subject", "退款"); paramMap.put("body", "退款"); paramMap.put("notifyUrl", notifyUrl); // 回调URL paramMap.put("param1", ""); // 扩展参数1 paramMap.put("param2", ""); paramMap.put("param4", "退款"); paramMap.put("amount", 1); //单位分 // 退款金额 paramMap.put("channelUser", "oZbAa6hwbFOAG8k_yByGq3UXlcgk"); // 微信openId paramMap.put("payOrderId","PDDY0020260104123816XXXX"); String reqSign = PayDigestUtil.getSign(paramMap, reqKey); System.out.println("加密参数:"+paramMap+";reqKey="+reqKey); System.out.println("sign="+reqSign); paramMap.put("sign", reqSign); // 签名 String reqDataencode = "params=" + URLEncoder.encode(paramMap.toJSONString()); String reqData = "params=" + paramMap.toJSONString(); System.out.println("请求支付中心退款接口,请求数据:" + reqData); String url = baseUrl + "/refund/create_order?"; String result = PayUtil.call4Post(url + reqDataencode); System.out.println("请求支付中心退款接口,响应数据:" + result); Map retMap = JSON.parseObject(result); if("SUCCESS".equals(retMap.get("retCode")) && "SUCCESS".equalsIgnoreCase(retMap.get("resCode").toString())) { // 验签 System.out.println(retMap); String checkSign = PayDigestUtil.getSign(retMap, repKey, "sign", "payParams"); String retSign = (String) retMap.get("sign"); if(checkSign.equals(retSign)) { System.out.println("=========支付中心退款验签成功========="); }else { System.err.println("=========支付中心退款验签失败========="); } } } static void quryRefundOrderTest() { JSONObject paramMap = new JSONObject(); paramMap.put("mchId", mchId); // 商户ID paramMap.put("mchOrderNo", "8739585736883499008"); // 商户订单号 paramMap.put("refundOrderId", "RDY002026050418170608"); // 支付订单号 paramMap.put("executeNotify", "false"); // 是否执行回调,true或false,如果为true当订单状态为支付成功(2)时,支付中心会再次回调一次业务系统 paramMap.put("channelId", "ABC_JL_C2B"); // 是否执行回调,true或false,如果为true当订单状态为支付成功(2)时,支付中心会再次回调一次业务系统 paramMap.put("param1", ""); // 是否执行回调,true或false,如果为true当订单状态为支付成功(2)时,支付中心会再次回调一次业务系统 String reqSign = PayDigestUtil.getSign(paramMap, reqKey); paramMap.put("sign", reqSign); // 签名 String reqData = "params=" + paramMap.toJSONString(); String url = baseUrl + "/query/refund?"; String result = PayUtil.call4Post(url + reqData); System.out.println("请求支付中心退单查询接口,响应数据:" + result); } }