微信小程序订单支付及退款功能
源码:
public class Test_OrderControllerImpl {private static final Logger logger = Logger.getLogger(PayServiceImpl.class);@Value("${WX_AppID}")private String appId;@Value("${NotityUrl}")private String notityUrl;@Testpublic JSONObject payOrder(PayDto payDto, HttpServletRequest request) {if (logger.isDebugEnabled()) {logger.debug("entering payOrder(PayDto)");logger.debug("payDto: "" + payDto + """);}JSONObject jsonObject = new JSONObject(); boolean result = true; String info = "成功了,获取到prepayId"; String openId = payDto.getOpenId(); if(StringUtils.isBlank(openId)) { String key = null; String mchId = null; openId = openId.replace(""", "").trim(); String clientIP = CommonUtil.getClientIp(request); int money = (int)(1*100); String orderCode = ""; logger.error("openId: " + openId + ", clientIP: " + clientIP + ", money: " + money + ", orderCode: " + orderCode ); String randomNonceStr = RandomUtils.generateMixString(32); MapString, String rest = unifiedOrder(openId,clientIP,randomNonceStr,money,orderCode,key,mchId); String prepayId = rest.get("prepay_id"); String randomStr = rest.get("nonce_str"); logger.error("prepayId: " + prepayId); if(StringUtils.isBlank(prepayId)) { result = false; info = "出错了,未获取到prepayId"; } else { String timeStamp = String.valueOf(System.currentTimeMillis() / 1000 ); SignInfo signInfo = new SignInfo();try {signInfo = createSignInfo(prepayId, randomStr, timeStamp);String sign = getTwoSign(signInfo,key);signInfo.setSign(sign);} catch (Exception e) {e.printStackTrace();} jsonObject.put("signInfo", signInfo); } } jsonObject.put("result", result); jsonObject.put("info", info); System.out.println("---------"+jsonObject+"----------"); return jsonObject;} private MapString, String unifiedOrder(String openId, String clientIP, String randomNonceStr, int money, String orderCode,String key,String mchId) { try { String url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; PayInfo payInfo = createPayInfo(openId,clientIP,randomNonceStr,money,orderCode,mchId); String md5 = getSign(payInfo,key); payInfo.setSign(md5); logger.error("md5 value: " + md5); String xml = CommonUtil.payInfoToXML(payInfo); xml = xml.replace("__", "_").replace("![CDATA[", "").replace("]]", ""); StringBuffer buffer = CommonUtil.httpsRequest(url, "POST", xml); MapString, String result = CommonUtil.parseXml(buffer.toString()); System.out.println("-----result----:"+result+"----"); String return_code = result.get("return_code"); if(StringUtils.isNotBlank(return_code) && return_code.equals("SUCCESS")) { String return_msg = result.get("return_msg"); if(StringUtils.isNotBlank(return_msg) && !return_msg.equals("OK")) { return null; } return result; } else { return null; } } catch (Exception e) { e.printStackTrace(); } return null; } private PayInfo createPayInfo(String openId, String clientIP, String randomNonceStr, int money,String orderCode,String mchId) { Date date = new Date(); String timeStart = TimeUtils.formatDate(date, "yyyyMMddHHmmss"); String timeExpire = TimeUtils.formatDate(TimeUtils.addDay(date, 2), "yyyyMMddHHmmss"); PayInfo payInfo = new PayInfo(); payInfo.setAppid(appId); payInfo.setMch_id(mchId); payInfo.setDevice_info("WEB"); payInfo.setNonce_str(randomNonceStr); payInfo.setSign_type("MD5"); payInfo.setBody("**"); payInfo.setAttach("商品名称"); payInfo.setOut_trade_no(orderCode); payInfo.setTotal_fee(money); payInfo.setSpbill_create_ip(clientIP); payInfo.setTime_start(timeStart); payInfo.setTime_expire(timeExpire); payInfo.setNotify_url(notityUrl); payInfo.setTrade_type("JSAPI"); payInfo.setLimit_pay("no_credit"); payInfo.setOpenid(openId); return payInfo; } private String getSign(PayInfo payInfo,String key) throws Exception { StringBuffer sb = new StringBuffer(); sb.append("appid=" + payInfo.getAppid()) .append("&attach=" + payInfo.getAttach()) .append("&body=" + payInfo.getBody()) .append("&device_info=" + payInfo.getDevice_info()) .append("&limit_pay=" + payInfo.getLimit_pay()) .append("&mch_id=" + payInfo.getMch_id()) .append("&nonce_str=" + payInfo.getNonce_str()) .append("¬ify_url=" + payInfo.getNotify_url()) .append("&openid=" + payInfo.getOpenid()) .append("&out_trade_no=" + payInfo.getOut_trade_no()) .append("&sign_type=" + payInfo.getSign_type())