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 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 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=""+ ""+packageParams.get("nonce_str")+""+ ""+sign+""+ ""+packageParams.get("mch_billno")+""+ ""+packageParams.get("mch_id")+""+ ""+packageParams.get("wxappid")+""+ ""+packageParams.get("send_name")+""+ ""+packageParams.get("re_openid")+""+ ""+packageParams.get("total_amount")+""+ ""+packageParams.get("total_num")+""+ ""+packageParams.get("wishing")+""+ ""+packageParams.get("act_name")+""+ ""+packageParams.get("remark")+""+ ""+packageParams.get("notify_way")+""+ ""+packageParams.get("scene_id")+""+ ""; return param; } /** * 获取企业支付的支付参数 * @param m */ public String getQiyePayParam(Map m){ //四位随机数 String mchBillno = WxConfig.MCH_ID+sdf.format(new Date())+(int)((Math.random()*9+1)*1000000000); String nonceStr = UUID.randomUUID().toString().replace("-", ""); SortedMap 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=""+ ""+packageParams.get("mch_appid")+""+ ""+sign+""+ ""+packageParams.get("mchid")+""+ ""+packageParams.get("nonce_str")+""+ ""+packageParams.get("partner_trade_no")+""+ ""+packageParams.get("openid")+""+ ""+packageParams.get("check_name")+""+ ""+packageParams.get("re_user_name")+""+ ""+packageParams.get("amount")+""+ ""+packageParams.get("desc")+""+ ""+packageParams.get("spbill_create_ip")+""+ ""; return param; } String createSign(SortedMap 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; } } }