package com.stylefeng.guns.modular.system.util;
|
|
import cn.hutool.http.HttpRequest;
|
import cn.hutool.http.HttpResponse;
|
import cn.hutool.http.HttpUtil;
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONObject;
|
import com.alipay.api.AlipayApiException;
|
import com.alipay.api.AlipayClient;
|
import com.alipay.api.DefaultAlipayClient;
|
import com.alipay.api.request.AlipaySystemOauthTokenRequest;
|
import com.alipay.api.response.AlipaySystemOauthTokenResponse;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.huifu.bspay.sdk.opps.core.BasePay;
|
import com.huifu.bspay.sdk.opps.core.config.MerConfig;
|
import com.huifu.bspay.sdk.opps.core.utils.DateTools;
|
import com.huifu.bspay.sdk.opps.core.utils.SequenceTools;
|
import com.stylefeng.guns.core.util.HttpUtils;
|
import com.stylefeng.guns.core.util.ToolUtil;
|
import com.stylefeng.guns.modular.huifu.biz.DouGongBasicDataBiz;
|
import com.stylefeng.guns.modular.huifu.properties.HuiFuProperties;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
|
import java.security.KeyFactory;
|
import java.security.PrivateKey;
|
import java.security.Signature;
|
import java.security.spec.PKCS8EncodedKeySpec;
|
import java.text.SimpleDateFormat;
|
import java.util.Base64;
|
import java.util.Date;
|
import java.util.TreeMap;
|
|
import static com.aliyun.oss.model.RoutingRule.Protocol.Http;
|
|
/**
|
* 斗拱支付工具类
|
*/
|
public class DouGongPayUtil {
|
|
@Autowired
|
private HuiFuProperties huiFuProperties;
|
|
|
@Value("${callbackPath}")
|
private static String callbackPath;//支付回调网关地址
|
|
public static void main(String[] args) throws Exception {
|
|
HttpRequest post = HttpUtil.createPost("https://api.huifu.com/v4/trade/payment/create");
|
String req_seq_id = System.currentTimeMillis() + ToolUtil.getRandomNumber(10);
|
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
|
String req_date = simpleDateFormat.format(new Date());
|
|
String a = "{\n" +
|
" \"req_seq_id\": \"" + req_seq_id + "\",\n" +
|
" \"req_date\": \"" + req_date + "\",\n" +
|
" \"huifu_id\": \"6666000182995771\",\n" +
|
" \"trade_type\": \"A_NATIVE\",\n" +
|
" \"trans_amt\": \"0.01\",\n" +
|
" \"goods_desc\": \"test\",\n" +
|
" \"remark\": \"嘉易行\",\n" +
|
" \"notify_url\": \""+"http://221.182.45.100:8006/base/DGCallBack"+"\",\n" +
|
" }";
|
// 去掉换行、空格等格式字符
|
a = a.replaceAll("\\s", "");
|
|
|
a = JSON.toJSONString(JSONObject.parseObject(a, TreeMap.class));
|
String sign = sign(a, "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCR6W3ynQJL7f2C8vFYMcQkcirpkif9ZhLq1374jIlV87nv0T9uIm6DoW8LyNEl9w2Yc5qoBv70tt/oVpemA6IZY6NXzE2USNi/sv2qUTtapcIRYxe4acCfY8K+x+p7W2e6wUWIpl9qgZA+UnFmHQ0HT6Ywzq2jJL92JdIs147Ud1aVi3aX8LYItj0z3ZKwZQkaJawZSWQk2+EdPfN059L2qFkPtnT7JIthAdUTJYZA13K4tzw6mXp/DbgwVmLhrlmwl/ccSv2Q0ABfEk7jIxF1nZmCmSy3HrEw9xWyrg1BC+DgXBdyF0OEtpNfv+UW080syUVBNN0irHVuDP81BaAjAgMBAAECggEAGlBZprZQErdxz6rWgYxADj6UpJjaI2XEJZwFZveZUOnqb2hyIv+MpKp5Z0upBErApey7SHAyjJlqWfE72hGvqxp/+7Z5izNz+2ZhPtT1ekyIajBPt89CkLwiA9vz2plKZLC0RIeUj5WcGNEvaDX3AomHtCehwtk+uiTp+XJKbOBtkkQszcdCGY1DVoQ0ppFoINnM9VLbEzaFaG7VS3eFkU4cf2CwcrnJB1RncyPFK+bGFvjkLM/eQbsh8YxkBqaGz/8UM1Na1SEidqdyUF71ltqnI0u8pLe0V+5jugVW+3lPL/p1C3i7mAbQOs4yqRWlFaGVTzOawoQUOPVwDpzeeQKBgQDs1P7F4wURqX1qZR0hSTqOigg48ychaOF66new3SuWk2CVBy8Q8b7odGSPyxJSGZvFLoznPYuSaXCtQ935WWfjB7Z5JpSWCi9BmJnkh41k/KvgMqAEGkZP6ul/zFnDWj94VwXEBz3TuRk574vK2coWoxjM6h1dlJjRBVVTs8dnrQKBgQCduKCjPDUuOHbcNn3VsaHEZX1XyiXN5gds08o61PjiHM42wYXxfUt59nBJmg2yAVRIrKYHfswJcxb5XUTDI5ZhCBnIPrdrQzj7FNadm/7mKDvSsvZdpfTiHY341XnvCq7OcNNj8g5fVsWF769strepQReSug7xgX7ojPvVcAZhDwKBgD57KwP2Er5IIuhQ6NCBS0uTqvurWqV70BDnjtBAaWF+XDq0/HvR63XUTzuIbbrvOqNY1p+jIxFrc+iiQQupxLimrkNkJEs5QKJjqiYahPkhmA68DG9Ip0gqR5QJy5y4UIplGwZOiscyzC72vcC0mJZETSSylzC7JV3vtEUy5ua5AoGAEwlDqjAMIyYBgpa5HV+xLKkrNbtaUL2gy8vMLsmhuHjNkuJMrlb3EyNhbiC/4moyqArehy0Qp1tSvIo7UGotLkzx/69CKBoW+IcNWDyJyXG1trqO7cKoCdqTViM98lIRwyzu9rMydONeN8o0HCT5id4nYDhAsXl1vc+2XY6F1pUCgYEA0dxGHBTKD/WzIvTYGYD6Xx224Y84mO6x2Mu16zFoq/NjuIdKi2O+92yrKDCMMCqaY77fXvWD3eI7QYYlbKAOqdLKVipTbhnBccDyNbtYHVg59t4xS+K6HyD+quVkL9n40UkxSZbKZBQhqt+vlQy0FUgONFii1ACZO0A8Sc/bvn4=");
|
System.out.println(a);
|
String p = "{\n" +
|
" \"sys_id\": \"6666000182995771\",\n" +
|
" \"product_id\": \"KAZX\",\n" +
|
" \"sign\": \"" + sign + "\",\n" +
|
" \"data\": {\n" +
|
" \"req_seq_id\": \"" + req_seq_id + "\",\n" +
|
" \"req_date\": \"" + req_date + "\",\n" +
|
" \"huifu_id\": \"6666000182995771\",\n" +
|
" \"trade_type\": \"A_NATIVE\",\n" +
|
" \"trans_amt\": \"0.01\",\n" +
|
" \"goods_desc\": \"test\",\n" +
|
" \"remark\": \"嘉易行\",\n" +
|
" \"notify_url\": \""+"http://221.182.45.100:8006/base/DGCallBack"+"\",\n" +
|
" }\n" +
|
"}\n";
|
System.out.println(p);
|
post.body(p);
|
|
HttpResponse execute = post.execute();
|
System.out.println(execute.body());
|
String body = execute.body();
|
JSONObject jsonObject = JSONObject.parseObject(body);
|
System.out.println(jsonObject);
|
}
|
|
|
/**
|
* 订单支付微信
|
* @param money
|
* @param openId
|
* @param goodsDesc
|
* @param type
|
* @param orderId
|
* @return
|
*/
|
public static ResultUtil wxPayOrder(String money, String openId, String goodsDesc, int type, String orderId, int callType) {
|
HttpRequest post = HttpUtil.createPost("https://api.huifu.com/v4/trade/payment/create");
|
String req_seq_id = orderId + "_" + type + "_" + System.currentTimeMillis() + ToolUtil.getRandomNumber(10);
|
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
|
String req_date = simpleDateFormat.format(new Date());
|
String notifyUrl = "";
|
switch (callType) {
|
case 1:
|
// 订单支付
|
notifyUrl = callbackPath + "/base/DGCallBack";
|
break;
|
case 2:
|
// 支付小件物流差价支付回调
|
notifyUrl = callbackPath +"/base/DGPayOrderLogisticsSpread";
|
break;
|
case 3:
|
// 购买出行卡支付回调
|
notifyUrl = callbackPath+"/base/DGPayTaxiCardPaymentSpread";
|
break;
|
case 4:
|
// 感谢费支付回调
|
notifyUrl = callbackPath + "/base/DGPayThankYouFee";
|
break;
|
case 5:
|
// 取消订单
|
notifyUrl = callbackPath + "/base/DGCancelOrderTaxi";
|
break;
|
case 6:
|
// 充值
|
notifyUrl = callbackPath + "/base/wxCancelUserBalance";
|
break;
|
}
|
String a = "{\n" +
|
" \"req_seq_id\": \"" + req_seq_id + "\",\n" +
|
" \"req_date\": \"" + req_date + "\",\n" +
|
" \"huifu_id\": \"6666000182995771\",\n" +
|
" \"trade_type\": \"T_MINIAPP\",\n" +
|
" \"trans_amt\": \"" + money + "\",\n" +
|
" \"goods_desc\": \"" + goodsDesc + "\",\n" +
|
" \"remark\": \"嘉易行\",\n" +
|
" \"notify_url\": \""+notifyUrl+"\",\n" +
|
" \"method_expand\": \"{\\\"sub_openid\\\":\\\"" + openId + "\\\"}\"\n" +
|
" }";
|
// 去掉换行、空格等格式字符
|
a = a.replaceAll("\\s", "");
|
|
|
a = JSON.toJSONString(JSONObject.parseObject(a, TreeMap.class));
|
String sign = sign(a, "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCR6W3ynQJL7f2C8vFYMcQkcirpkif9ZhLq1374jIlV87nv0T9uIm6DoW8LyNEl9w2Yc5qoBv70tt/oVpemA6IZY6NXzE2USNi/sv2qUTtapcIRYxe4acCfY8K+x+p7W2e6wUWIpl9qgZA+UnFmHQ0HT6Ywzq2jJL92JdIs147Ud1aVi3aX8LYItj0z3ZKwZQkaJawZSWQk2+EdPfN059L2qFkPtnT7JIthAdUTJYZA13K4tzw6mXp/DbgwVmLhrlmwl/ccSv2Q0ABfEk7jIxF1nZmCmSy3HrEw9xWyrg1BC+DgXBdyF0OEtpNfv+UW080syUVBNN0irHVuDP81BaAjAgMBAAECggEAGlBZprZQErdxz6rWgYxADj6UpJjaI2XEJZwFZveZUOnqb2hyIv+MpKp5Z0upBErApey7SHAyjJlqWfE72hGvqxp/+7Z5izNz+2ZhPtT1ekyIajBPt89CkLwiA9vz2plKZLC0RIeUj5WcGNEvaDX3AomHtCehwtk+uiTp+XJKbOBtkkQszcdCGY1DVoQ0ppFoINnM9VLbEzaFaG7VS3eFkU4cf2CwcrnJB1RncyPFK+bGFvjkLM/eQbsh8YxkBqaGz/8UM1Na1SEidqdyUF71ltqnI0u8pLe0V+5jugVW+3lPL/p1C3i7mAbQOs4yqRWlFaGVTzOawoQUOPVwDpzeeQKBgQDs1P7F4wURqX1qZR0hSTqOigg48ychaOF66new3SuWk2CVBy8Q8b7odGSPyxJSGZvFLoznPYuSaXCtQ935WWfjB7Z5JpSWCi9BmJnkh41k/KvgMqAEGkZP6ul/zFnDWj94VwXEBz3TuRk574vK2coWoxjM6h1dlJjRBVVTs8dnrQKBgQCduKCjPDUuOHbcNn3VsaHEZX1XyiXN5gds08o61PjiHM42wYXxfUt59nBJmg2yAVRIrKYHfswJcxb5XUTDI5ZhCBnIPrdrQzj7FNadm/7mKDvSsvZdpfTiHY341XnvCq7OcNNj8g5fVsWF769strepQReSug7xgX7ojPvVcAZhDwKBgD57KwP2Er5IIuhQ6NCBS0uTqvurWqV70BDnjtBAaWF+XDq0/HvR63XUTzuIbbrvOqNY1p+jIxFrc+iiQQupxLimrkNkJEs5QKJjqiYahPkhmA68DG9Ip0gqR5QJy5y4UIplGwZOiscyzC72vcC0mJZETSSylzC7JV3vtEUy5ua5AoGAEwlDqjAMIyYBgpa5HV+xLKkrNbtaUL2gy8vMLsmhuHjNkuJMrlb3EyNhbiC/4moyqArehy0Qp1tSvIo7UGotLkzx/69CKBoW+IcNWDyJyXG1trqO7cKoCdqTViM98lIRwyzu9rMydONeN8o0HCT5id4nYDhAsXl1vc+2XY6F1pUCgYEA0dxGHBTKD/WzIvTYGYD6Xx224Y84mO6x2Mu16zFoq/NjuIdKi2O+92yrKDCMMCqaY77fXvWD3eI7QYYlbKAOqdLKVipTbhnBccDyNbtYHVg59t4xS+K6HyD+quVkL9n40UkxSZbKZBQhqt+vlQy0FUgONFii1ACZO0A8Sc/bvn4=");
|
System.out.println(a);
|
String p = "{\n" +
|
" \"sys_id\": \"6666000182995771\",\n" +
|
" \"product_id\": \"KAZX\",\n" +
|
" \"sign\": \"" + sign + "\",\n" +
|
" \"data\": {\n" +
|
" \"req_seq_id\": \"" + req_seq_id + "\",\n" +
|
" \"req_date\": \"" + req_date + "\",\n" +
|
" \"huifu_id\": \"6666000182995771\",\n" +
|
" \"trade_type\": \"T_MINIAPP\",\n" +
|
" \"trans_amt\": \"" + money + "\",\n" +
|
" \"goods_desc\": \"" + goodsDesc + "\",\n" +
|
" \"remark\": \"嘉易行\",\n" +
|
" \"notify_url\": \""+notifyUrl+"\",\n" +
|
" \"method_expand\": \"{\\\"sub_openid\\\":\\\"" + openId + "\\\"}\"\n" +
|
" }\n" +
|
"}\n";
|
System.out.println(p);
|
post.body(p);
|
|
HttpResponse execute = post.execute();
|
System.out.println(execute.body());
|
JSONObject jsonObject = JSONObject.parseObject(execute.body());
|
return ResultUtil.success(jsonObject);
|
}
|
|
/**
|
* 订单支付 支付宝
|
* @param money
|
* @param buyerId
|
* @param goodsDesc
|
* @param type
|
* @param orderId
|
* @return
|
*/
|
public static ResultUtil aliPayOrder(String money, String buyerId, String goodsDesc, int type, String orderId, int callType) {
|
HttpRequest post = HttpUtil.createPost("https://api.huifu.com/v4/trade/payment/create");
|
String req_seq_id = orderId + "_" + type + "_" + System.currentTimeMillis() + ToolUtil.getRandomNumber(10);
|
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
|
String req_date = simpleDateFormat.format(new Date());
|
String notifyUrl = "";
|
switch (callType) {
|
case 1:
|
// 订单支付
|
notifyUrl = callbackPath + "/base/DGCallBack";
|
break;
|
case 2:
|
// 支付小件物流差价支付回调
|
notifyUrl = callbackPath +"/base/DGPayOrderLogisticsSpread";
|
break;
|
case 3:
|
// 购买出行卡支付回调
|
notifyUrl = callbackPath+"/base/DGPayTaxiCardPaymentSpread";
|
break;
|
case 4:
|
// 感谢费支付回调
|
notifyUrl = callbackPath + "/base/DGPayThankYouFee";
|
break;
|
case 5:
|
// 取消订单
|
notifyUrl = callbackPath + "/base/DGCancelOrderTaxi";
|
break;
|
case 6:
|
// 充值
|
notifyUrl = callbackPath + "/base/wxCancelUserBalance";
|
break;
|
}
|
String a = "{\n" +
|
" \"req_seq_id\": \"" + req_seq_id + "\",\n" +
|
" \"req_date\": \"" + req_date + "\",\n" +
|
" \"huifu_id\": \"6666000182995771\",\n" +
|
" \"trade_type\": \"A_NATIVE\",\n" +
|
" \"trans_amt\": \"" + money + "\",\n" +
|
" \"goods_desc\": \"" + goodsDesc + "\",\n" +
|
" \"remark\": \"嘉易行\",\n" +
|
" \"notify_url\": \""+notifyUrl+"\",\n" +
|
" }";
|
// 去掉换行、空格等格式字符
|
a = a.replaceAll("\\s", "");
|
|
|
a = JSON.toJSONString(JSONObject.parseObject(a, TreeMap.class));
|
String sign = sign(a, "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCR6W3ynQJL7f2C8vFYMcQkcirpkif9ZhLq1374jIlV87nv0T9uIm6DoW8LyNEl9w2Yc5qoBv70tt/oVpemA6IZY6NXzE2USNi/sv2qUTtapcIRYxe4acCfY8K+x+p7W2e6wUWIpl9qgZA+UnFmHQ0HT6Ywzq2jJL92JdIs147Ud1aVi3aX8LYItj0z3ZKwZQkaJawZSWQk2+EdPfN059L2qFkPtnT7JIthAdUTJYZA13K4tzw6mXp/DbgwVmLhrlmwl/ccSv2Q0ABfEk7jIxF1nZmCmSy3HrEw9xWyrg1BC+DgXBdyF0OEtpNfv+UW080syUVBNN0irHVuDP81BaAjAgMBAAECggEAGlBZprZQErdxz6rWgYxADj6UpJjaI2XEJZwFZveZUOnqb2hyIv+MpKp5Z0upBErApey7SHAyjJlqWfE72hGvqxp/+7Z5izNz+2ZhPtT1ekyIajBPt89CkLwiA9vz2plKZLC0RIeUj5WcGNEvaDX3AomHtCehwtk+uiTp+XJKbOBtkkQszcdCGY1DVoQ0ppFoINnM9VLbEzaFaG7VS3eFkU4cf2CwcrnJB1RncyPFK+bGFvjkLM/eQbsh8YxkBqaGz/8UM1Na1SEidqdyUF71ltqnI0u8pLe0V+5jugVW+3lPL/p1C3i7mAbQOs4yqRWlFaGVTzOawoQUOPVwDpzeeQKBgQDs1P7F4wURqX1qZR0hSTqOigg48ychaOF66new3SuWk2CVBy8Q8b7odGSPyxJSGZvFLoznPYuSaXCtQ935WWfjB7Z5JpSWCi9BmJnkh41k/KvgMqAEGkZP6ul/zFnDWj94VwXEBz3TuRk574vK2coWoxjM6h1dlJjRBVVTs8dnrQKBgQCduKCjPDUuOHbcNn3VsaHEZX1XyiXN5gds08o61PjiHM42wYXxfUt59nBJmg2yAVRIrKYHfswJcxb5XUTDI5ZhCBnIPrdrQzj7FNadm/7mKDvSsvZdpfTiHY341XnvCq7OcNNj8g5fVsWF769strepQReSug7xgX7ojPvVcAZhDwKBgD57KwP2Er5IIuhQ6NCBS0uTqvurWqV70BDnjtBAaWF+XDq0/HvR63XUTzuIbbrvOqNY1p+jIxFrc+iiQQupxLimrkNkJEs5QKJjqiYahPkhmA68DG9Ip0gqR5QJy5y4UIplGwZOiscyzC72vcC0mJZETSSylzC7JV3vtEUy5ua5AoGAEwlDqjAMIyYBgpa5HV+xLKkrNbtaUL2gy8vMLsmhuHjNkuJMrlb3EyNhbiC/4moyqArehy0Qp1tSvIo7UGotLkzx/69CKBoW+IcNWDyJyXG1trqO7cKoCdqTViM98lIRwyzu9rMydONeN8o0HCT5id4nYDhAsXl1vc+2XY6F1pUCgYEA0dxGHBTKD/WzIvTYGYD6Xx224Y84mO6x2Mu16zFoq/NjuIdKi2O+92yrKDCMMCqaY77fXvWD3eI7QYYlbKAOqdLKVipTbhnBccDyNbtYHVg59t4xS+K6HyD+quVkL9n40UkxSZbKZBQhqt+vlQy0FUgONFii1ACZO0A8Sc/bvn4=");
|
System.out.println(a);
|
String p = "{\n" +
|
" \"sys_id\": \"6666000182995771\",\n" +
|
" \"product_id\": \"KAZX\",\n" +
|
" \"sign\": \"" + sign + "\",\n" +
|
" \"data\": {\n" +
|
" \"req_seq_id\": \"" + req_seq_id + "\",\n" +
|
" \"req_date\": \"" + req_date + "\",\n" +
|
" \"huifu_id\": \"6666000182995771\",\n" +
|
" \"trade_type\": \"A_NATIVE\",\n" +
|
" \"trans_amt\": \"" + money + "\",\n" +
|
" \"goods_desc\": \"" + goodsDesc + "\",\n" +
|
" \"remark\": \"嘉易行\",\n" +
|
" \"notify_url\": \""+notifyUrl+"\",\n" +
|
" }\n" +
|
"}\n";
|
System.out.println(p);
|
post.body(p);
|
|
HttpResponse execute = post.execute();
|
JSONObject jsonObject = JSONObject.parseObject(execute.body());
|
return ResultUtil.success(jsonObject);
|
}
|
|
|
public static String sign(String data, String privateKeyBase64) {
|
// Base64 --> Key
|
try {
|
byte[] bytes = Base64.getDecoder().decode(privateKeyBase64);
|
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes);
|
KeyFactory keyFactory;
|
keyFactory = KeyFactory.getInstance("RSA");
|
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
|
// Sign
|
Signature signature = Signature.getInstance("SHA256WithRSA");
|
signature.initSign(privateKey);
|
signature.update(data.getBytes("UTF-8"));
|
return Base64.getEncoder().encodeToString(signature.sign());
|
} catch (Exception e) {
|
return null;
|
}
|
}
|
|
|
}
|