栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

微信支付—Java实现

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

微信支付—Java实现

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

一 基础准备 1.微信支付业务—商户注册微信支付业务
  • 网址 https://pay.weixin.qq.com
    注册后会获得
  • 商户编号:1497984412**
    商户账号AppID:wx632c8f211f8122c6**
    商户Key:sbNCm1JnevqI36LrEaxFwcaT0hkGxFnC**
2.申请支付订单—商户向支付平台申请支付链接

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

2.1 导入微信支付的依赖
  • wxpay的maven依赖

	com.github.wxpay
	 wxpay-sdk
	 0.0.3

二 实现流程 1.流程图

2.代码实现 2.1 配置类-配置商户信息
  • 创建⼀个配置类,实现WxPayConfig接⼝
    重写三分⽅法,分别设置商户AppID商户ID商户密钥
public class MyPayConfig implements WXPayConfig {
    @Override
    public String getAppID() {
        return "wx632c8f211f8122c6";
    }

    @Override
    public String getMchID() {
        return "1497984412";
    }

    @Override
    public String getKey() {
        return "sbNCm1JnevqI36LrEaxFwcaT0hkGxFnC";
    }

    @Override
    public InputStream getCertStream() {
        return null;
    }

    @Override
    public int getHttpConnectTimeoutMs() {
        return 0;
    }

    @Override
    public int getHttpReadTimeoutMs() {
        return 0;
    }
}
2.2 订单添加接口实现

需要通过配置一个Map来 设置支付订单的参数 发送给微信支付端接口

@RestController
@CrossOrigin
@RequestMapping("/order")
@Api(value = "提供订单相关的操作接口",tags = "订单管理")
public class OrderController {

    @Autowired
    private OrderService orderService;

    @PostMapping("/add")
    public ResultVO add(String cids, @RequestBody Orders order){
        ResultVO resultVO = null;
        try {
            Map orderInfo = orderService.addOrder(cids, order);
            if(orderInfo!=null){
                String orderId = orderInfo.get("orderId");
                
                //设置当前订单信息
                HashMap data = new HashMap<>();
                data.put("body",orderInfo.get("productNames"));  		//商品描述
                data.put("out_trade_no",orderId);              		    //使用当前用户订单的编号作为当前支付交易的交易号
                data.put("fee_type","CNY");                    		    //支付币种
                data.put("total_fee",order.getActualAmount()*100+"");   //支付金额(以分为单位 要乘以100)
                data.put("trade_type","NATIVE");             		    //交易类型
                data.put("notify_url","http://47.118.45.73:8080/pay/callback");           //设置支付完成时的回调方法接口(微信端收到钱会向此url发送支付完成信息)

                //发送请求,获取响应
                //微信支付:申请支付连接
                WXPay wxPay = new WXPay(new MyPayConfig());
                Map resp = wxPay.unifiedOrder(data); 
                //resp是支付完成 微信端返回的一Map格式传输数据 里面有支付地址 -code_url
                orderInfo.put("payUrl",resp.get("code_url"));
                //orderInfo中包含:订单编号,购买的商品名称,支付链接 
                //返回给前端页面ResultVO 前端页面通过payUrl生成支付二维码完成支付
                resultVO = new ResultVO(ResStatus.OK,"提交订单成功!",orderInfo);
            }else{
                resultVO = new ResultVO(ResStatus.NO,"提交订单失败!",null);
            }
        } catch (SQLException e) {
            resultVO = new ResultVO(ResStatus.NO,"提交订单失败!",null);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return resultVO;
    }
}
2.3支付回调接口

⽀付回调:当⽤户⽀付成功之后,⽀付平台会向我们指定的服务器接⼝发送请求传递订单⽀付状态数据

@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 map = WXPayUtil.xmlToMap(s);

  	//如果回调信息中result_code为success则支付成功
     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 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;
 }
}
三 实现效果
  • 支付订单页面

  • 支付完成

四 思考
//设置当前订单信息
  HashMap data = new HashMap<>();
   data.put("body",orderInfo.get("productNames"));  		//商品描述
   data.put("out_trade_no",orderId);              		    //使用当前用户订单的编号作为当前支付交易的交易号
   data.put("fee_type","CNY");                    		    //支付币种
   data.put("total_fee",order.getActualAmount()*100+"");   //支付金额(以分为单位 要乘以100)
   data.put("trade_type","NATIVE");             		    //交易类型
   data.put("notify_url","http://47.118.45.73:8080/pay/callback");  //此地址为公网ip地址可以接收微信端信息

如果按照上面所示的配置,当⽤户⽀付成功之后,微信⽀付平台会向http://192.168.55.3:8080/pay/callback发送请求,
但我们的服务端项⽬是运⾏在本地计算机的(IP为内⽹IP),微信平台没办法访问内网只能访问公网
所以 我们可以通过两种方法实现:1.内网穿透—Ngrok 2.购买服务器将项目上云

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/684620.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号