当前位置:   article > 正文

微信Navite扫二维码支付_wxpayunifiedorderrequest

wxpayunifiedorderrequest

场景:springboot网页点击缴费,弹出二维码,支付成功后回调服务器,保存订单信息。

1.先导入包,返回二维码链接,采用第三方包qrcode-utils生成图片。

  1. <dependency>
  2. <groupId>com.github.binarywang</groupId>
  3. <artifactId>weixin-java-pay</artifactId>
  4. <version>4.0.0</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.projectlombok</groupId>
  8. <artifactId>lombok</artifactId>
  9. <scope>provided</scope>
  10. </dependency>
  11. <dependency>
  12. <groupId>com.github.binarywang</groupId>
  13. <artifactId>qrcode-utils</artifactId>
  14. <version>1.1</version>
  15. </dependency>

2. 在后台获取配置信息,写在yml

3.写个属性类,读取yml文件

  1. @Data
  2. @ConfigurationProperties(prefix = "wx.pay")
  3. public class WxPayProperties {
  4. private String appId;
  5. private String mchId;
  6. private String mchKey;
  7. private String subMchId;
  8. private String certPath;
  9. private String apiV3Key;
  10. private String privateKeyPath;
  11. private String privateCertPath;
  12. private String notifyUrl;
  13. }

 

4.写个配置类,把配置文件属性注入WxPayService

  1. package com.ruoyi.web.controller.onlinepay.config;
  2. import com.github.binarywang.wxpay.service.WxPayService;
  3. import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
  4. import com.ruoyi.common.utils.StringUtils;
  5. import lombok.AllArgsConstructor;
  6. import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
  7. import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
  8. import org.springframework.boot.context.properties.EnableConfigurationProperties;
  9. import org.springframework.context.annotation.Bean;
  10. import org.springframework.context.annotation.Configuration;
  11. @Configuration
  12. @ConditionalOnClass(WxPayService.class)
  13. @EnableConfigurationProperties(WxPayProperties.class)
  14. @AllArgsConstructor
  15. public class WxPayConfig {
  16. private WxPayProperties properties;
  17. @Bean
  18. @ConditionalOnMissingBean
  19. public WxPayService wxService() {
  20. com.github.binarywang.wxpay.config.WxPayConfig payConfig = new com.github.binarywang.wxpay.config.WxPayConfig();
  21. payConfig.setAppId(StringUtils.trimToNull(this.properties.getAppId()));
  22. payConfig.setMchId(StringUtils.trimToNull(this.properties.getMchId()));
  23. payConfig.setMchKey(StringUtils.trimToNull(this.properties.getMchKey()));
  24. payConfig.setKeyPath(StringUtils.trimToNull(this.properties.getCertPath()));
  25. payConfig.setNotifyUrl(StringUtils.trimToNull(this.properties.getNotifyUrl()));
  26. payConfig.setSubMchId(StringUtils.trimToNull(this.properties.getSubMchId()));
  27. // 可以指定是否使用沙箱环境
  28. payConfig.setUseSandboxEnv(false);
  29. WxPayService wxPayService = new WxPayServiceImpl();
  30. wxPayService.setConfig(payConfig);
  31. return wxPayService;
  32. }
  33. }

5. 写个实现类WeChatService,实现类实现预支付wxPayService.unifiedOrder(wrequest)

  public WxPayUnifiedOrderResult createUnifiedOrder(SysChargeVoucher sysChargeVoucher, HttpServletRequest request);
  1. package com.ruoyi.web.controller.onlinepay.service.impl;
  2. import cn.hutool.json.JSONObject;
  3. import com.github.binarywang.wxpay.bean.order.WxPayMwebOrderResult;
  4. import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
  5. import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult;
  6. import com.github.binarywang.wxpay.constant.WxPayConstants;
  7. import com.github.binarywang.wxpay.exception.WxPayException;
  8. import com.github.binarywang.wxpay.service.WxPayService;
  9. import com.ruoyi.system.domain.SysChargeVoucher;
  10. import com.ruoyi.web.controller.onlinepay.config.WxPayConfig;
  11. import com.ruoyi.web.controller.onlinepay.service.WeChatService;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.stereotype.Service;
  14. import javax.servlet.http.HttpServletRequest;
  15. import java.math.BigDecimal;
  16. import java.util.HashMap;
  17. import java.util.Map;
  18. @Service
  19. public class WeChatServiceImpl implements WeChatService {
  20. @Autowired
  21. private WxPayService wxPayService;
  22. @Autowired(required=false)
  23. private WxPayUnifiedOrderRequest orderRequest;
  24. @Autowired
  25. private WxPayConfig wxPayConfig;
  26. @Override
  27. public String createOrderInfo(SysChargeVoucher sysChargeVoucher,HttpServletRequest request) {
  28. WxPayMwebOrderResult result = null;
  29. try {
  30. orderRequest.setOutTradeNo(sysChargeVoucher.getChargeBillId()+"");
  31. orderRequest.setBody("我是商品描述");
  32. orderRequest.setTotalFee(sysChargeVoucher.getAmount().multiply(new BigDecimal("100")).intValue());//金额需要扩大100倍:1代表支付时是0.01
  33. orderRequest.setSpbillCreateIp(this.getAddrIp(request));
  34. orderRequest.setProductId(sysChargeVoucher.getChargeVoucherId()+"");
  35. orderRequest.setTradeType(WxPayConstants.TradeType.MWEB);// h5网页支付
  36. result = wxPayService.createOrder(orderRequest);
  37. } catch (WxPayException e) {
  38. e.printStackTrace();
  39. }
  40. return result.getMwebUrl();
  41. }
  42. @Override
  43. public WxPayUnifiedOrderResult createUnifiedOrder(SysChargeVoucher sysChargeVoucher, HttpServletRequest request) {
  44. wxPayService= wxPayConfig.wxService();
  45. WxPayUnifiedOrderResult rest=new WxPayUnifiedOrderResult();
  46. try {
  47. WxPayUnifiedOrderRequest wrequest = new WxPayUnifiedOrderRequest();
  48. wrequest.setDeviceInfo("WEB");//设备号
  49. wrequest.setBody("物业缴费");//商品描述
  50. wrequest.setOutTradeNo(sysChargeVoucher.getDocumentNo()+"_"+sysChargeVoucher.getChargeVoucherId());//商户订单号
  51. JSONObject map = new JSONObject();
  52. map.put("conventionalChargeIds",sysChargeVoucher.getConventionalChargeIds());
  53. map.put("meterChargeIds",sysChargeVoucher.getMeterChargeIds());
  54. map.put("temporaryChargeIds",sysChargeVoucher.getTemporaryChargeIds());
  55. map.put("apportionChargeIds",sysChargeVoucher.getApportionChargeIds());
  56. wrequest.setDetail(map.toString());//商品详情
  57. wrequest.setTotalFee(sysChargeVoucher.getAmount().multiply(new BigDecimal("100")).intValue());//总金额|分计
  58. wrequest.setSpbillCreateIp(this.getAddrIp(request));//终端IP
  59. wrequest.setTradeType("NATIVE");//交易类型
  60. wrequest.setProductId(sysChargeVoucher.getDocumentNo()+"_"+sysChargeVoucher.getChargeVoucherId());//商品id
  61. rest=wxPayService.unifiedOrder(wrequest);
  62. } catch (WxPayException e) {
  63. rest.setErrCodeDes(e.getErrCodeDes());
  64. rest.setErrCode(e.getResultCode());
  65. }
  66. return rest;
  67. }
  68. private String getAddrIp(HttpServletRequest request){
  69. return request.getRemoteAddr();
  70. }
  71. }

 

6.点击缴费,触发创建二维码

html

  1. <button type="button" id="erCodeBut" data-toggle="modal" data-target="#myModal6" style="display: none"></button>
  2. <div class="modal inmodal fade" id="myModal6" tabindex="-1" role="dialog" aria-hidden="true">
  3. <div class="modal-dialog modal-sm">
  4. <div class="modal-content">
  5. <div class="modal-header">
  6. <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
  7. <h4 class="modal-title">微信支付</h4>
  8. <span id="tips"></span>
  9. <span id="wxamount">0</span>
  10. </div>
  11. <div class="modal-body" style="background-color: #00a65a;text-align: center;">
  12. <img id="img2" style="width:200px;height:200px;"/>
  13. </div>
  14. </div>
  15. </div>
  16. </div>

JS 

  1. var url = ctx + "pay/createQRCode";
  2. $.ajax({
  3. url: url,
  4. type: "post",
  5. dataType: "json",
  6. data: data,
  7. success: function (result) {
  8. if(result.code==0){
  9. $('#erCodeBut').trigger("click");
  10. $('#img2').attr('src', 'data:image/png;base64,' + result.msg);
  11. var p=$('#propertyUnitName').val();
  12. var c=$('#customerName').val();
  13. $('#tips').text("尊敬的"+c+"先生/女士,您名下单元:"+p+"的物业费用为:");
  14. $('#wxamount').text(result.data.amount);
  15. }else if(result.code==301){
  16. alert(result.msg);
  17. }else{
  18. alert("生成二维码识别,请重试!");
  19. }
  20. }
  21. });

后台请求 

  1. package com.ruoyi.web.controller.onlinepay.controller;
  2. import com.github.binarywang.utils.qrcode.QrcodeUtils;
  3. import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
  4. import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult;
  5. import com.github.binarywang.wxpay.exception.WxPayException;
  6. import com.github.binarywang.wxpay.service.WxPayService;
  7. import com.ruoyi.common.core.controller.BaseController;
  8. import com.ruoyi.common.core.domain.AjaxResult;
  9. import com.ruoyi.system.domain.*;
  10. import com.ruoyi.system.service.*;
  11. import com.ruoyi.web.controller.onlinepay.service.WeChatService;
  12. import lombok.AllArgsConstructor;
  13. import me.chanjar.weixin.common.error.WxErrorException;
  14. import org.apache.commons.codec.binary.Base64;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.stereotype.Controller;
  17. import org.springframework.transaction.annotation.Transactional;
  18. import org.springframework.web.bind.annotation.PostMapping;
  19. import org.springframework.web.bind.annotation.RequestBody;
  20. import org.springframework.web.bind.annotation.RequestMapping;
  21. import org.springframework.web.bind.annotation.ResponseBody;
  22. import javax.servlet.http.HttpServletRequest;
  23. import javax.servlet.http.HttpServletResponse;
  24. import java.io.BufferedOutputStream;
  25. import java.math.BigDecimal;
  26. import java.util.List;
  27. @RequestMapping("/pay")
  28. @Controller
  29. @AllArgsConstructor
  30. public class WxPayController extends BaseController {
  31. @Autowired
  32. private ISysChargeVoucherService sysChargeVoucherService;
  33. @Autowired
  34. private ISysChargeBillService sysChargeBillService;
  35. @Autowired
  36. private ISysConventionalChargeService sysConventionalChargeService;
  37. @Autowired
  38. private ISysMeterChargeService sysMeterChargeService;
  39. @Autowired
  40. private ISysTemporaryChargeService sysTemporaryChargeService;
  41. @Autowired
  42. private ISysApportionChargeService sysApportionChargeService;
  43. @Autowired
  44. private ISysChargeVoucherDetailService sysChargeVoucherDetailService;
  45. @Autowired
  46. private WeChatService weChatService;
  47. private WxPayService wxService;
  48. @PostMapping("/createQRCode")
  49. @ResponseBody
  50. public AjaxResult createQRCode(SysChargeVoucher sysChargeVoucher,HttpServletRequest req){
  51. SysChargeVoucher chargeVoucher=sysChargeVoucher.clone();
  52. chargeVoucher.setDocumentNo(null);
  53. chargeVoucher.setStatus("0");
  54. List<SysChargeVoucher> chargeList=sysChargeVoucherService.selectSysChargeVoucherList(chargeVoucher);
  55. if(chargeList.size()==0){
  56. sysChargeVoucher=this.addSysChargeVoucher(sysChargeVoucher);
  57. }else{
  58. sysChargeVoucher=chargeList.get(0);
  59. }
  60. if(sysChargeVoucher!=null&&sysChargeVoucher.getChargeVoucherId()!=null){
  61. WxPayUnifiedOrderResult result = weChatService.createUnifiedOrder(sysChargeVoucher, req);
  62. if (result != null && result.getCodeURL() != null) {
  63. byte[] qrCodeBytes = QrcodeUtils.createQrcode(result.getCodeURL(), null);
  64. String ercode = Base64.encodeBase64String(qrCodeBytes);
  65. return AjaxResult.success(ercode, sysChargeVoucher);
  66. } else if (result != null && result.getErrCode() != null) {
  67. return AjaxResult.warn(result.getErrCodeDes());
  68. }
  69. }
  70. return AjaxResult.error();
  71. }
  72. /**
  73. * 读取支付结果通知
  74. *
  75. * @param xmlData
  76. * @throws WxPayException
  77. */
  78. @PostMapping("/getOrderNotifyResult")
  79. public String getOrderNotifyResult(@RequestBody String xmlData, HttpServletRequest request, HttpServletResponse response) throws WxErrorException, WxPayException {
  80. WxPayOrderNotifyResult orderNotifyResult = this.wxService.parseOrderNotifyResult(xmlData);
  81. String noticeStr = null;
  82. try {
  83. BufferedOutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
  84. // 支付成功,商户处理后同步返回给微信参数
  85. if (!orderNotifyResult.getResultCode().equals("SUCCESS")) {
  86. // 支付失败, 记录流水失败
  87. System.out.println("===============支付失败==============");
  88. noticeStr = setXML("FAIL", "支付失败");
  89. outputStream.write(noticeStr.getBytes());
  90. outputStream.flush();
  91. outputStream.close();
  92. } else {
  93. // TODO 处理你的业务,修改订单状态等
  94. String outTradeNo= orderNotifyResult.getOutTradeNo();
  95. String[] arr=outTradeNo.split("_");
  96. SysChargeVoucher sysChargeVoucher =sysChargeVoucherService.selectSysChargeVoucherById(Long.parseLong(arr[1]));
  97. updateSysChargeVoucher(sysChargeVoucher);
  98. // 通知微信已经收到消息,不要再给我发消息了,否则微信会8连击调用本接口
  99. noticeStr = setXML("SUCCESS", "支付成功");
  100. outputStream.write(noticeStr.getBytes());
  101. outputStream.flush();
  102. outputStream.close();
  103. }
  104. } catch (Exception e) {
  105. e.printStackTrace();
  106. }
  107. return noticeStr;
  108. }
  109. public String setXML(String return_code, String return_msg) {
  110. return "<xml><return_code><![CDATA[" + return_code + "]]></return_code><return_msg><![CDATA[" + return_msg + "]]></return_msg></xml>";
  111. }
  112. }

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/874126
推荐阅读
相关标签
  

闽ICP备14008679号