微信支付开发文档地址:https://pay.weixin.qq.com/wiki/doc/api/index.html

一、应用场景

image.png
线下场所付款方式:(便利店、自动贩卖机)
1、顾客出示二维码,店员用扫码枪进行扫码
2、展示二维码,让顾客进行扫码支付
公众号付款方式:
app付款方式:做第三方应用(app),可以集成微信支付功能,由app 去调微信支付功能,就可以进行支付了
PC网站付款方式:网站展示二维码,让顾客进行扫码支付
image.pngimage.png 微信支付实现 - 图4

二、开发准备

先登录,获取openid

三、开发流程

调用统一下单支付api

  1. CreateOrderRequestVo unifiedorderVo = getUnifiedorderVo(weixinPay, "o8C3f5VUxyZGd58JxDi38q5JrTjo", clientIp, appId, mchId, signKey);
  2. CreateOrderResponseVo responseVo = unifiedOrder(unifiedorderVo);
  1. /**
  2. * 获取微信预下单对象(JSAPI支付)
  3. * @return 微信预下单对象
  4. */
  5. private CreateOrderRequestVo getUnifiedorderVo(WeixinPay weixinPay, String openid, String ip, String appId, String mchId, String signKey) {
  6. // 获取域名
  7. String domain = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_SITE_URL);
  8. String apiDomain = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_API_URL);
  9. AttachVo attachVo = new AttachVo(Constants.Small_Shop_Settle_Pay, weixinPay.getUid());
  10. CreateOrderRequestVo vo = new CreateOrderRequestVo();
  11. // List<StoreOrderInfo> orderInfoList = storeOrderInfoService.getListByOrderNo(storeOrder.getOrderId());
  12. vo.setAppid(appId);
  13. vo.setMch_id(mchId);
  14. vo.setNonce_str(WxPayUtil.getNonceStr());
  15. vo.setSign_type(PayConstants.WX_PAY_SIGN_TYPE_MD5);
  16. // vo.setBody(PayConstants.PAY_BODY);
  17. // vo.setBody(orderInfoList.get(0).getProductName());
  18. String siteName = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_SITE_NAME);
  19. // 因商品名称在微信侧超长更换为网站名称
  20. vo.setBody(siteName);
  21. vo.setAttach(JSONObject.toJSONString(attachVo));
  22. vo.setOut_trade_no(CrmebUtil.getOrderNo("wxNo"));
  23. // 订单中使用的是BigDecimal,这里要转为Integer类型
  24. vo.setTotal_fee(weixinPay.getPayPrice().multiply(BigDecimal.TEN).multiply(BigDecimal.TEN).intValue());
  25. vo.setSpbill_create_ip(ip);
  26. vo.setNotify_url(apiDomain + PayConstants.WX_PAY_NOTIFY_API_URI);
  27. if (weixinPay.getPaymentChannel().equals(PayConstants.PAY_CHANNEL_WE_CHAT_H5)){// H5
  28. vo.setTrade_type(PayConstants.WX_PAY_TRADE_TYPE_H5);
  29. vo.setOpenid(null);
  30. }
  31. if (weixinPay.getPaymentChannel().equals(PayConstants.PAY_CHANNEL_WE_CHAT_PROGRAM)){// 小程序
  32. vo.setTrade_type(PayConstants.WX_PAY_TRADE_TYPE_JS);
  33. vo.setOpenid(openid);
  34. }
  35. if (weixinPay.getPaymentChannel().equals(PayConstants.PAY_CHANNEL_WE_CHAT_APP_IOS) || weixinPay.getPaymentChannel().equals(PayConstants.PAY_CHANNEL_WE_CHAT_APP_ANDROID)) {
  36. vo.setTrade_type("APP");
  37. vo.setOpenid(null);
  38. }
  39. CreateOrderH5SceneInfoVo createOrderH5SceneInfoVo = new CreateOrderH5SceneInfoVo(
  40. new CreateOrderH5SceneInfoDetailVo(
  41. domain,
  42. systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_SITE_NAME)
  43. )
  44. );
  45. vo.setScene_info(JSONObject.toJSONString(createOrderH5SceneInfoVo));
  46. String sign = WxPayUtil.getSign(vo, signKey);
  47. vo.setSign(sign);
  48. vo.setSmallShopSettledPayRequest(weixinPay.getSmallShopSettledPayRequest());
  49. return vo;
  50. }
  1. private CreateOrderResponseVo unifiedOrder(CreateOrderRequestVo unifiedorderVo) {
  2. try {
  3. String url = PayConstants.WX_PAY_API_URL + PayConstants.WX_PAY_API_URI;
  4. String request = XmlUtil.objectToXml(unifiedorderVo);
  5. String xml = restTemplateUtil.postXml(url, request);
  6. HashMap<String, Object> map = XmlUtil.xmlToMap(xml);
  7. if (null == map) {
  8. throw new CrmebException("微信下单失败!");
  9. }
  10. CreateOrderResponseVo responseVo = CrmebUtil.mapToObj(map, CreateOrderResponseVo.class);
  11. return responseVo;
  12. } catch (Exception e) {
  13. e.printStackTrace();
  14. throw new CrmebException(e.getMessage());
  15. }
  16. }