近期公司调完银联,调支付宝,调完支付宝调微信.说实话微信的帮助文档确实是烂,而且有没有技术支持,害的我头发都掉了一桌.不说废话了,看代码.
首先登陆微信的公众平台(微信的服务号不是订阅号),然后选择微信支付–>开发设置,设置好支付回调URL和支付授权目录(授权目录最少精确到二级目录,比如你的需要使用微信支付的目录是:www.weixinpay.com/sp/weixin/pay.do,那么对应的是:www.weixinpay.com/sp/weixin/),设置好后编写代码.
对了,联调支付,一般都需要外网能够访问的URL地址,这里建议使用过ngrok软件,直接在本地联调,使用方式,下载一个ngrok,然后由命令行窗口进入ngrok解压的目录,然后执行:
ngrok.exe -config ngrok.cfg -subdomain weixinpay(可以改成自己喜欢的域名) 8080(可以改成自己喜欢的端口)
首先生成微信二维码(1):
/**
* 生成微信二维码图片
* @throws Exception
*/
public void gainQRCode() throws Exception {
try {
String orderNu = request.getParameter("orderNu");
String describe = request.getParameter("describe");
String payCodeType = request.getParameter("payCodeType");
System.out.println("订单编号:"+"\n"+orderNu);
String price = request.getParameter("txnAmt");
if(StringUtils.isBlank(orderNu)){//账户充值,不用签名校验
orderNu = "WE"+StringUtil.getTableId(false);
} else {
String sign = request.getParameter("sign");
String signParam = "orderNu="+orderNu+"&payPrice="+price;
String newSign = DigestUtils.md5Hex(signParam.getBytes("utf-8"));
if(!newSign.equalsIgnoreCase(sign)){
Map param = new HashMap<>();
param.put("statu", "2");
JSONArray jsonProduct = JSONArray.fromObject(param);
System.out.println("json: "+jsonProduct.toString());
response.getWriter().print(jsonProduct.toString());
return ;
}
}
System.out.println("没有转换的金额:"+"\n"+price);
BigDecimal bigDecimalPrice = new BigDecimal(price);
String pric = bigDecimalPrice.multiply(new BigDecimal(100)).toString().split("\\.")[0];
System.out.println("转换后的金额:"+"\n"+pric);
String filePostfix = "jpg";
// 二维码图片名称
String codePng = System.currentTimeMillis() + "." + filePostfix;
// 保存路径
// 应用ID
String appid = Config.APPID;
// 商户ID
String mch_id = Config.MCHID;
String key = Config.KEY;
// 生成32位的随机字符串
String nonce_str = RandomStringUtil.generate().toUpperCase();
// 商户产品ID
User user = SessionUtil.getSysUserFormSession(request);
String product_id = "";
if(StringUtils.isNotBlank(payCodeType) && "1".equals(payCodeType)){//账户充值
product_id = "1_"+orderNu+"_"+"账户保证金充值"+"_"+pric+"_"+user.getUniversalid();
} else if (StringUtils.isNotBlank(payCodeType) && "2".equals(payCodeType)){//订单结算
product_id = "2_"+orderNu+"_"+describe+"_"+pric+"_"+user.getUniversalid();
}
//上面的可以不关注.关注下面的签名和发送的参数,54行开始
// 时间戳
String time_stamp = System.currentTimeMillis()+"";
String sign = "";//这些参数可以去微信扫码的支付的文档看看具体是什么意思
String temp = "appid=" + appid + "&mch_id=" + mch_id + "&nonce_str=" + nonce_str + "&" + "product_id="
+ product_id + "&time_stamp=" + time_stamp;
String signTemp = temp + "&key=" + key;
System.out.println("二维码请求参数:"+"\n"+temp);
sign = Encrypt.e(signTemp).toUpperCase();
String contentUrl = "weixin://wxpay/bizpayurl?" + temp + "&sign=" + sign;
String url = QRCODE_PATH + File.separator + File.separator + codePng;
File f = new File(url);
if(!f.exists()){
f.mkdirs();
}
System.out.println("已生成二维码url");
QRImgCode.encode(contentUrl, "二维码", 400, 400, url);
System.out.println("二维码已经生成成功");
Map param = new HashMap<>();
param.put("statu", "1");
param.put("imgName"