java開發記錄-微信H5支付
阿新 • • 發佈:2018-12-12
一點點關於微信H5支付開發的總結.
接入成功後就可以進行程式碼設計啦.
此次測試開發是在springboot環境下完成的,下面列出微信支付用到的相關依賴:
<dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-mp</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-pay</artifactId> <version>3.1.0</version> </dependency>
1.PayUtils工具類
用來儲存appid,key,金鑰以及商品戶號資訊,建立並配置好wxMpService用於後續啟動微信統一下單的介面.
public class PayUtils { /** * 公眾號AppId */ public static final String APP_ID = "xxx"; /** * 公眾號AppSecret */ public static final String APP_SECRET = "xxx"; /** * 微信支付商戶號 */ public static final String MCH_ID = "xxx"; /** * 微信支付API祕鑰 */ public static final String KEY = "xxx"; /** * 回撥域名 */ public static final String REDIRECT_DOMAIN = "http://xxx.com"; private static final WxMpService wxMpService = new WxMpServiceImpl(); private static final WxPayService wxPayService = new WxPayServiceImpl(); static { WxMpInMemoryConfigStorage config = new WxMpInMemoryConfigStorage(); config.setAppId(APP_ID); config.setSecret(APP_SECRET); wxMpService.setWxMpConfigStorage(config); WxPayConfig payConfig = new WxPayConfig(); payConfig.setAppId(APP_ID); payConfig.setMchId(MCH_ID); payConfig.setMchKey(KEY); payConfig.setSignType(WxPayConstants.SignType.MD5); //h5公眾號支付 payConfig.setTradeType("MWEB"); payConfig.setNotifyUrl(REDIRECT_DOMAIN + "/pay/success"); wxPayService.setConfig(payConfig); } public static WxMpService wxMpService() { return wxMpService; } public static WxPayService wxPayService() { return wxPayService; } }
2.後臺controller:
@RequestMapping(value = "/h5Pay") public void h5Pay(HttpServletRequest request, HttpServletResponse response, ModelMap model) { Map<String,Object> result = new HashMap<>(); result.put("success",false); try{ WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest(); orderRequest.setBody("微信H5支付測試"); orderRequest.setOutTradeNo(UUID.randomUUID().toString().replace("-", "")); //商品支付金額 //此處可直接寫入數字來進行測試,也可通過引數形式賦值 orderRequest.setTotalFee(Integer.valueOf(request.getParameter("total_fee"))); orderRequest.setSpbillCreateIp(getRealIp(request)); //H5支付標識為MWEB orderRequest.setTradeType("MWEB"); orderRequest.setSceneInfo("{\"h5_info\": {\"type\":\"Wap\",\"wap_url\": \""+PayUtils.REDIRECT_DOMAIN+"\",\"wap_name\": \"本地測試\"}}"); orderRequest.setSignType("MD5"); //簽名建立 Map<String,String> packageParams = new HashMap<>(); packageParams.put("appid", PayUtils.APP_ID); packageParams.put("mch_id", PayUtils.MCH_ID); packageParams.put("nonce_str", UUID.randomUUID().toString().replace("-", "")); packageParams.put("signType",orderRequest.getSignType()); String sign = SignUtils.createSign(packageParams,"MD5", PayUtils.KEY,false); orderRequest.setSign(sign); WxPayMwebOrderResult orderResult =PayUtils.wxPayService().createOrder(orderRequest); String mwebUrl = orderResult.getMwebUrl(); response.sendRedirect(mwebUrl); result.put("success",true); }catch (Exception e){ result.put("errormsg",e.getMessage()); } model.addAttribute("result",result); } //獲取真實ip地址 通過阿帕奇代理的也能獲取到真實ip public static String getRealIp(HttpServletRequest request){ String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){ ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){ ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){ ip = request.getRemoteAddr(); } return ip; }
3.介面呼叫就不貼了,直接寫在a標籤或其它方式均可.
新人第一次寫,望包涵.有錯和不足之處希望指出.這裡只是針對統一下單進行了整理,後續的API還在研究當中...若有轉載,請註明出處謝謝.