package com.xzx.gc.common.utils.payutil;
|
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.stereotype.Service;
|
|
import java.security.MessageDigest;
|
import java.text.SimpleDateFormat;
|
import java.util.*;
|
|
@Service
|
@Slf4j
|
public class WxRequestParam {
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
|
|
/**
|
* 小程序现金红包支付参数
|
* @param m
|
* @return
|
*/
|
public String getXcxParam(Map<String, String> m){
|
|
//四位随机数
|
String mchBillno = WxConfig.MCH_ID+sdf.format(new Date())+(int)((Math.random()*9+1)*1000000000);
|
String nonceStr = UUID.randomUUID().toString().replace("-", "");
|
// 备注
|
String remark = "beizhu";
|
// 祝福语
|
String wishing = "gongxifacai";
|
// 场景id
|
String sceneId = "PRODUCT_1";
|
// 活动名称
|
String actName = "gongxifacai";
|
// 商户名称(微信红包发送者名称,最好用英文)
|
String sendName = "xiaozongxiao";
|
// 红包发放总人数
|
String totalNum = "1";
|
|
SortedMap<String, String> packageParams = new TreeMap<>();
|
// 活动名称
|
packageParams.put("act_name", actName);
|
// 用户openId
|
packageParams.put("re_openid", m.get("reOpenid"));
|
// 商户名称(微信红包发送者名称,最好用英文)
|
packageParams.put("send_name", sendName);
|
// 红包金额
|
packageParams.put("total_amount", m.get("totalAmount"));
|
// 红包发放总人数
|
packageParams.put("total_num", totalNum);
|
// 通知用户形式
|
packageParams.put("notify_way", WxConfig.WX_NOTITY_WAY);
|
// 备注
|
packageParams.put("remark", remark);
|
// 商户订单号
|
packageParams.put("mch_billno", mchBillno);
|
// 商户号
|
packageParams.put("mch_id", WxConfig.MCH_ID);
|
// /随机字符串
|
packageParams.put("nonce_str",nonceStr);
|
// 场景id
|
packageParams.put("scene_id", sceneId);
|
// 红包祝福语
|
packageParams.put("wishing", wishing);
|
// 公众账号appid
|
packageParams.put("wxappid", WxConfig.WXAPP_ID);
|
|
//生成签名
|
String sign = createSign(packageParams,WxConfig.WX_API_KEY,"UTF-8");
|
String param="<xml>"+
|
"<nonce_str>"+packageParams.get("nonce_str")+"</nonce_str>"+
|
"<sign>"+sign+"</sign>"+
|
"<mch_billno>"+packageParams.get("mch_billno")+"</mch_billno>"+
|
"<mch_id>"+packageParams.get("mch_id")+"</mch_id>"+
|
"<wxappid>"+packageParams.get("wxappid")+"</wxappid>"+
|
"<send_name>"+packageParams.get("send_name")+"</send_name>"+
|
"<re_openid>"+packageParams.get("re_openid")+"</re_openid>"+
|
"<total_amount>"+packageParams.get("total_amount")+"</total_amount>"+
|
"<total_num>"+packageParams.get("total_num")+"</total_num>"+
|
"<wishing>"+packageParams.get("wishing")+"</wishing>"+
|
"<act_name>"+packageParams.get("act_name")+"</act_name>"+
|
"<remark>"+packageParams.get("remark")+"</remark>"+
|
"<notify_way>"+packageParams.get("notify_way")+"</notify_way>"+
|
"<scene_id>"+packageParams.get("scene_id")+"</scene_id>"+
|
"</xml>";
|
return param;
|
}
|
|
/**
|
* 获取企业支付的支付参数
|
* @param m
|
*/
|
public String getQiyePayParam(Map<String, String> m){
|
//四位随机数
|
String mchBillno = WxConfig.MCH_ID+sdf.format(new Date())+(int)((Math.random()*9+1)*1000000000);
|
String nonceStr = UUID.randomUUID().toString().replace("-", "");
|
|
SortedMap<String, String> packageParams = new TreeMap<>();
|
|
// 企业付款金额,单位为分
|
packageParams.put("amount", m.get("totalAmount"));
|
// 商户appid下,某用户的openid
|
packageParams.put("openid", m.get("reOpenid"));
|
|
// 申请商户号的appid或商户号绑定的appid
|
packageParams.put("mch_appid", WxConfig.WXAPP_ID);
|
// 微信支付分配的商户号
|
packageParams.put("mchid", WxConfig.MCH_ID);
|
// 微信支付分配的终端设备号
|
// packageParams.put("device_info", "");
|
// 随机字符串,不长于32位
|
packageParams.put("nonce_str", nonceStr);
|
// 商户订单号,需保持唯一性(只能是字母或者数字,不能包含有其他字符)
|
packageParams.put("partner_trade_no", mchBillno);
|
// NO_CHECK:不校验真实姓名 FORCE_CHECK:强校验真实姓名
|
packageParams.put("check_name", "NO_CHECK");
|
// 收款用户真实姓名。 如果check_name设置为FORCE_CHECK,则必填用户真实姓名
|
packageParams.put("re_user_name", "xx");
|
// 企业付款备注
|
packageParams.put("desc", "remark");
|
// Ip地址
|
packageParams.put("spbill_create_ip", "0.0.0.0");
|
|
//生成签名
|
String sign = createSign(packageParams,WxConfig.WX_API_KEY,"UTF-8");
|
|
String param="<xml>"+
|
"<mch_appid>"+packageParams.get("mch_appid")+"</mch_appid>"+
|
"<sign>"+sign+"</sign>"+
|
"<mchid>"+packageParams.get("mchid")+"</mchid>"+
|
"<nonce_str>"+packageParams.get("nonce_str")+"</nonce_str>"+
|
"<partner_trade_no>"+packageParams.get("partner_trade_no")+"</partner_trade_no>"+
|
"<openid>"+packageParams.get("openid")+"</openid>"+
|
"<check_name>"+packageParams.get("check_name")+"</check_name>"+
|
"<re_user_name>"+packageParams.get("re_user_name")+"</re_user_name>"+
|
"<amount>"+packageParams.get("amount")+"</amount>"+
|
"<desc>"+packageParams.get("desc")+"</desc>"+
|
"<spbill_create_ip>"+packageParams.get("spbill_create_ip")+"</spbill_create_ip>"+
|
"</xml>";
|
return param;
|
}
|
|
String createSign(SortedMap<String, String> paraMap,String key,String charset) {
|
StringBuffer sb = new StringBuffer();
|
Set es = paraMap.entrySet();
|
Iterator it = es.iterator();
|
while (it.hasNext()) {
|
Map.Entry entry = (Map.Entry) it.next();
|
String k = (String) entry.getKey();
|
String v = (String) entry.getValue();
|
if (null != v && !"".equals(v) && !"sign".equals(k)
|
&& !"key".equals(k)) {
|
sb.append(k + "=" + v + "&");
|
}
|
}
|
sb.append("key=" + key);
|
System.out.println("===========签名参数====="+sb.toString());
|
String sign = md5Password(sb.toString()).toUpperCase();
|
// String sign = MD5Util.encode(sb.toString()).toUpperCase();
|
System.out.println("===========生成的签名是====="+sign);
|
return sign;
|
|
}
|
|
/**
|
* 生成32位md5码
|
*
|
* @param key
|
* @return
|
*/
|
static String md5Password(String key) {
|
char hexDigits[] = {
|
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
|
};
|
try {
|
byte[] btInput = key.getBytes();
|
// 获得MD5摘要算法的 MessageDigest 对象
|
MessageDigest mdInst = MessageDigest.getInstance("MD5");
|
// 使用指定的字节更新摘要
|
mdInst.update(btInput);
|
// 获得密文
|
byte[] md = mdInst.digest();
|
// 把密文转换成十六进制的字符串形式
|
int j = md.length;
|
char str[] = new char[j * 2];
|
int k = 0;
|
for (int i = 0; i < j; i++) {
|
byte byte0 = md[i];
|
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
|
str[k++] = hexDigits[byte0 & 0xf];
|
}
|
return new String(str);
|
} catch (Exception e) {
|
return null;
|
}
|
}
|
|
|
|
}
|