微信支付开发文档地址:https://pay.weixin.qq.com/wiki/doc/api/index.html
一、应用场景

线下场所付款方式:(便利店、自动贩卖机)
1、顾客出示二维码,店员用扫码枪进行扫码
2、展示二维码,让顾客进行扫码支付
公众号付款方式:
app付款方式:做第三方应用(app),可以集成微信支付功能,由app 去调微信支付功能,就可以进行支付了
PC网站付款方式:网站展示二维码,让顾客进行扫码支付
二、开发准备
三、开发流程
调用统一下单支付api
CreateOrderRequestVo unifiedorderVo = getUnifiedorderVo(weixinPay, "o8C3f5VUxyZGd58JxDi38q5JrTjo", clientIp, appId, mchId, signKey);CreateOrderResponseVo responseVo = unifiedOrder(unifiedorderVo);
/*** 获取微信预下单对象(JSAPI支付)* @return 微信预下单对象*/private CreateOrderRequestVo getUnifiedorderVo(WeixinPay weixinPay, String openid, String ip, String appId, String mchId, String signKey) {// 获取域名String domain = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_SITE_URL);String apiDomain = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_API_URL);AttachVo attachVo = new AttachVo(Constants.Small_Shop_Settle_Pay, weixinPay.getUid());CreateOrderRequestVo vo = new CreateOrderRequestVo();// List<StoreOrderInfo> orderInfoList = storeOrderInfoService.getListByOrderNo(storeOrder.getOrderId());vo.setAppid(appId);vo.setMch_id(mchId);vo.setNonce_str(WxPayUtil.getNonceStr());vo.setSign_type(PayConstants.WX_PAY_SIGN_TYPE_MD5);// vo.setBody(PayConstants.PAY_BODY);// vo.setBody(orderInfoList.get(0).getProductName());String siteName = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_SITE_NAME);// 因商品名称在微信侧超长更换为网站名称vo.setBody(siteName);vo.setAttach(JSONObject.toJSONString(attachVo));vo.setOut_trade_no(CrmebUtil.getOrderNo("wxNo"));// 订单中使用的是BigDecimal,这里要转为Integer类型vo.setTotal_fee(weixinPay.getPayPrice().multiply(BigDecimal.TEN).multiply(BigDecimal.TEN).intValue());vo.setSpbill_create_ip(ip);vo.setNotify_url(apiDomain + PayConstants.WX_PAY_NOTIFY_API_URI);if (weixinPay.getPaymentChannel().equals(PayConstants.PAY_CHANNEL_WE_CHAT_H5)){// H5vo.setTrade_type(PayConstants.WX_PAY_TRADE_TYPE_H5);vo.setOpenid(null);}if (weixinPay.getPaymentChannel().equals(PayConstants.PAY_CHANNEL_WE_CHAT_PROGRAM)){// 小程序vo.setTrade_type(PayConstants.WX_PAY_TRADE_TYPE_JS);vo.setOpenid(openid);}if (weixinPay.getPaymentChannel().equals(PayConstants.PAY_CHANNEL_WE_CHAT_APP_IOS) || weixinPay.getPaymentChannel().equals(PayConstants.PAY_CHANNEL_WE_CHAT_APP_ANDROID)) {vo.setTrade_type("APP");vo.setOpenid(null);}CreateOrderH5SceneInfoVo createOrderH5SceneInfoVo = new CreateOrderH5SceneInfoVo(new CreateOrderH5SceneInfoDetailVo(domain,systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_SITE_NAME)));vo.setScene_info(JSONObject.toJSONString(createOrderH5SceneInfoVo));String sign = WxPayUtil.getSign(vo, signKey);vo.setSign(sign);vo.setSmallShopSettledPayRequest(weixinPay.getSmallShopSettledPayRequest());return vo;}
private CreateOrderResponseVo unifiedOrder(CreateOrderRequestVo unifiedorderVo) {try {String url = PayConstants.WX_PAY_API_URL + PayConstants.WX_PAY_API_URI;String request = XmlUtil.objectToXml(unifiedorderVo);String xml = restTemplateUtil.postXml(url, request);HashMap<String, Object> map = XmlUtil.xmlToMap(xml);if (null == map) {throw new CrmebException("微信下单失败!");}CreateOrderResponseVo responseVo = CrmebUtil.mapToObj(map, CreateOrderResponseVo.class);return responseVo;} catch (Exception e) {e.printStackTrace();throw new CrmebException(e.getMessage());}}
