1.通过微信平台为商家提供代收款服务

微信⽀付业务—商户注册微信⽀付业务

申请appid和key

image.png

2.申请⽀付订单—商户向⽀付平台申请⽀付链接

⽀付订单,并不是⽤户提交的商品订单,⽽是商户向微信⽀付平台申请的⽀付链接

2.1导入依赖

wxpay的maven依赖

  1. <dependency>
  2. <groupId>com.github.wxpay</groupId>
  3. <artifactId>wxpay-sdk</artifactId>
  4. <version>0.0.3</version>
  5. </dependency>

2.2 创建微信⽀付配置类,配置商户信息

创建⼀类,实现WxPayConfig接⼝
重写三分⽅法,分别设置商户AppID\商户ID\商户密钥

  1. package com.qfedu.fmmall.config;
  2. import com.github.wxpay.sdk.WXPayConfig;
  3. import java.io.InputStream;
  4. public class MyPayConfig implements WXPayConfig {
  5. @Override
  6. public String getAppID() {
  7. return "wx632c8f211f8122c6";
  8. }
  9. @Override
  10. public String getMchID() {
  11. return "1497984412";
  12. }
  13. @Override
  14. public String getKey() {
  15. return "sbNCm1JnevqI36LrEaxFwcaT0hkGxFnC";
  16. }
  17. @Override
  18. public InputStream getCertStream() {
  19. return null;
  20. }
  21. @Override
  22. public int getHttpConnectTimeoutMs() {
  23. return 0;
  24. }
  25. @Override
  26. public int getHttpReadTimeoutMs() {
  27. return 0;
  28. }
  29. }

2.3 设置⽀付订单的参数

  1. HashMap<String,String> data = new HashMap<>();
  2. data.put("body","咪咪萧条"); //商品描述
  3. data.put("out_trade_no",orderId); //使⽤当前⽤户订单的编号作为当前⽀付交易的
  4. 交易号
  5. data.put("fee_type","CNY"); //⽀付币种
  6. data.put("total_fee","1"); //⽀付⾦额
  7. data.put("trade_type","NATIVE"); //交易类型
  8. data.put("notify_url","/pay/success"); //设置⽀付完成时的回调⽅法
  9. 接⼝

2.4 申请⽀付链接

  1. WXPay wxPay = new WXPay(new MyPayConfig());
  2. Map<String, String> resp = wxPay.unifiedOrder(data); //发送请求
  3. orderInfo.put("payUrl",resp.get("code_url"));

全部代码
  1. @PostMapping("/add")
  2. public ResultVO add(String cids, @RequestBody Orders order){
  3. ResultVO resultVO = null;
  4. try {
  5. Map<String, String> orderInfo = orderService.addOrder(cids, order);
  6. if(orderInfo!=null){
  7. String orderId = orderInfo.get("orderId");
  8. //设置当前订单信息
  9. HashMap<String,String> data = new HashMap<>();
  10. data.put("body",orderInfo.get("productNames")); //商品描述
  11. data.put("out_trade_no",orderId); //使用当前用户订单的编号作为当前支付交易的交易号
  12. data.put("fee_type","CNY"); //支付币种
  13. //data.put("total_fee",order.getActualAmount()*100+""); //支付金额
  14. data.put("total_fee","1");
  15. data.put("trade_type","NATIVE"); //交易类型
  16. data.put("notify_url","http://47.118.45.73:8080/pay/callback"); //设置支付完成时的回调方法接口
  17. //发送请求,获取响应
  18. //微信支付:申请支付连接
  19. WXPay wxPay = new WXPay(new MyPayConfig());
  20. Map<String, String> resp = wxPay.unifiedOrder(data);
  21. orderInfo.put("payUrl",resp.get("code_url"));
  22. //orderInfo中包含:订单编号,购买的商品名称,支付链接
  23. resultVO = new ResultVO(ResStatus.OK,"提交订单成功!",orderInfo);
  24. }else{
  25. resultVO = new ResultVO(ResStatus.NO,"提交订单失败!",null);
  26. }
  27. } catch (SQLException e) {
  28. resultVO = new ResultVO(ResStatus.NO,"提交订单失败!",null);
  29. } catch (Exception e) {
  30. e.printStackTrace();
  31. }
  32. return resultVO;
  33. }

2.5支付回调,修改订单状态。


package com.qfedu.fmmall.controller;

import com.github.wxpay.sdk.WXPayUtil;
import com.qfedu.fmmall.service.OrderService;
import com.qfedu.fmmall.websocket.WebSocketServer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.websocket.Session;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/pay")
public class PayController {

    @Autowired
    private OrderService orderService;

    /**
     * 回调接口:当用户支付成功之后,微信支付平台就会请求这个接口,将支付状态的数据传递过来
     */
    @RequestMapping("/callback")
    public String paySuccess(HttpServletRequest request) throws Exception {
        System.out.println("--------------------callback");
        // 1.接收微信支付平台传递的数据(使用request的输入流接收)
        ServletInputStream is = request.getInputStream();
        byte[] bs = new byte[1024];
        int len = -1;
        StringBuilder builder = new StringBuilder();
        while((len = is.read(bs))!=-1){
            builder.append(new String(bs,0,len));
        }
        String s = builder.toString();
        //使用帮助类将xml接口的字符串装换成map
        Map<String, String> map = WXPayUtil.xmlToMap(s);

        if(map!=null && "success".equalsIgnoreCase(map.get("result_code"))){
            //支付成功
            //2.修改订单状态为“待发货/已支付”
            String orderId = map.get("out_trade_no");
            int i = orderService.updateOrderStatus(orderId, "2");
            System.out.println("--orderId:"+orderId);
            //3.通过websocket连接,向前端推送消息
            WebSocketServer.sendMsg(orderId,"1");

            //4.响应微信支付平台
            if(i>0){
                HashMap<String,String> resp = new HashMap<>();
                resp.put("return_code","success");
                resp.put("return_msg","OK");
                resp.put("appid",map.get("appid"));
                resp.put("result_code","success");
                return WXPayUtil.mapToXml(resp);
            }
        }
        return null;
    }

}

2.6定时任务,查询订单状态