1. 程式人生 > >java開發記錄-微信H5支付

java開發記錄-微信H5支付

一點點關於微信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還在研究當中...若有轉載,請註明出處謝謝.