/**
*
* @Title: xcxPay
* @Description: (小程序支付通用方法)
* @param map
* @return Map<String,Object> (这里描述输出参数的作用)
* @throws Exception
* @throws
* @author huyuhang
* @date 2019年3月27日 下午1:53:56
*/
public static Map<String,Object> xcxPay(Map<String,Object> map) throws Exception{
Map<String, Object> payParam = new HashMap<String,Object>();
String appid=(String)map.get("appid");//小程序对于的AppID
String partner_key=(String)map.get("partner_key");//秘钥
String mch_id=(String)map.get("mch_id");//小程序对应得商户号
String description=(String)map.get("description");//小程序对于的描述
String number=(String)map.get("number");//用户充值记录的订单号
BigDecimal price= (BigDecimal)map.get("price");//对于的支付价格
String openid=(String)map.get("openid");//小程序支付对应人的openid
String attach=(String)map.get("attach");
String notify_url=(String)map.get("notify_url");//回调地址
String apppath = (String)map.get("apppath");//项目IP地址
//组装掉器支付参数 begin
Map<String, Object> data = new HashMap<String, Object>();
data.put("appid", appid);
data.put("mch_id",mch_id);
data.put("nonce_str", String.valueOf(System.currentTimeMillis() * 3));
data.put("body",description);
data.put("out_trade_no", number);
data.put("total_fee", String.valueOf(price.multiply(new BigDecimal(100)).intValue()));
data.put("spbill_create_ip", apppath);
data.put("notify_url", notify_url);
data.put("trade_type", "JSAPI");
data.put("attach", attach);
data.put("openid", openid);
LogUtil.info("xcxPay***********data=" +data.toString());
//组装掉器支付参数 end
//将参数进行排序处理begin
List<String> list = getSort(data);
//将参数进行排序处理end
//xml begin
Document document = DocumentHelper.createDocument();
Element xml = document.addElement("xml");
StringBuffer str = new StringBuffer();
for (String key : list) {
xml.addElement(key).addCDATA(data.get(key).toString());
str.append(key + "=" + data.get(key) + "&");
}
str.append("key=" + partner_key);// 密钥(PartnerKey)
xml.addElement("sign").addCDATA(com.dns.common.terminal.base.MD5Utils.StringToMD5(str.toString()).toUpperCase());
//xml end
//调用接口 begin
LogUtil.info("xcxPay***********发送" + document.asXML());
String back = SendUtil.sendToUrl(document.asXML(), "https://api.mch.weixin.qq.com/pay/unifiedorder", "utf-8");
LogUtil.info("xcxPay***********返回" + back);
//调用接口 end 返回
//解析返回报文 begin
Document backDom = DocumentHelper.parseText(back);
Element root = backDom.getRootElement();
if ("SUCCESS".equals(root.element("return_code").getTextTrim()) && "SUCCESS".equals(root.element("result_code").getTextTrim())){
payParam.put("appId",appid);//小程序所需要的支付参数
payParam.put("timeStamp", System.currentTimeMillis());//小程序所需要的支付参数
payParam.put("nonceStr", String.valueOf(System.currentTimeMillis() * 3));//小程序所需要的支付参数
payParam.put("package", "prepay_id=" + root.element("prepay_id").getTextTrim());//小程序所需要的支付参数
payParam.put("signType", "MD5");//小程序所需要的支付参数
StringBuffer payStr = new StringBuffer();
List<String> payList = getSort(payParam);
for (String key : payList) {
payStr.append(key + "=" + payParam.get(key) + "&");
}
payStr.append("key=" +partner_key);// 密钥(PartnerKey)
payParam.put("paySign", StringToMD5(payStr.toString()).toUpperCase()); //小程序所需要的支付参数
payParam.put("number",number);//获取参数成功 ,告诉小程序端订单号 非小程序所需要的支付参数
}else{
//payParam.put("ifToPay","false");//默认给小程序掉起参数失败,置为失败标识
throw new Exception("小程序获取支付参数失败");
}
return payParam;
}
public static List<String> getSort(Map<String, Object> map) {
List<String> list = new ArrayList<String>();
Set<String> keys = map.keySet();
for (String key : keys) {
list.add(key);
}
Collections.sort(list);
return list;
}
public static String StringToMD5(String plainText) {
String md5str = "";
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(plainText.getBytes());
byte b[] = md.digest();
int i;
StringBuffer buf = new StringBuffer("");
for (int offset = 0; offset < b.length; offset++) {
i = b[offset];
if (i < 0)
i += 256;
if (i < 16)
buf.append("0");
buf.append(Integer.toHexString(i));
}
md5str = buf.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
// 默认密码:"123456"
md5str = "e10adc3949ba59abbe56e057f20f883e";
}
return md5str;
}
原文地址:https://www.cnblogs.com/xadminhuyh/p/10652856.html