springboot整合IJPay实现微信支付---微信小程序

系列文章目录


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

微信支付适用于许多场合,如小程序、网页支付、但微信支付相对于其他支付方式略显麻烦,我们使用IJpay框架进行整合


提示:以下是本篇文章正文内容,下面案例可供参考

一、IJpay是什么?

JPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里

二、使用步骤

1.准备小程序必要信息

   1.1 要在小程序端关联商户号

   1.2在application.properties文件中配置相关信息

1.3导入IJpay依赖

          <dependency>
            <groupId>com.github.javen205</groupId>
            <artifactId>IJPay-All</artifactId>
            <version>2.2.0</version>
            </dependency>

2.具体操作

    2.1新建config包,新建WxPayProperties类

   

  2.2从配置文件中读取properties中数据

package com.zhengyang.wxpay.config;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;

/**
 * @Author: Hello World
 * @Date: 2021/5/17 15:04
 * @Description:
 */
@Data
@Component
public class WxPayProperties {

    /**
     * appid.
     */
    @Value("${appid}")
    private String appId;

    /**
     * 微信支付商户号.
     */
    @Value("${mchid}")
    private String mchId;

    /**
     * 微信支付商户密钥.
     */
    @Value("${mchKey}")
    private String mchKey;

    /**
     * 异步回调地址
     */
    @Value("${notifyUrl}")
    private String notifyUrl;
}

 2.3新建pojo包新建订单对象和jsApi模班对象

   订单实体类 

package com.zhengyang.wxpay.pojo;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
import java.util.Date;

/**
 * @author Lenovo
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Order implements Serializable {

  private static final long serialVersionUID = 2310688218645441222L;
  /**订单表id*/
  private long orderId;
  /**订单号*/
  private String orderNum;
  /**用户openid*/
  private String openid;
  /**支付金额*/
  private double money;

}
JsApiOrderModel实体类需要继承Ijpay下的BaseModel
package com.zhengyang.wxpay.pojo;


import com.ijpay.core.model.BaseModel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @Author: Hello World
 * @Date: 2021/5/18 10:46
 * @Description:
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class JsApiOrderModel extends BaseModel {
    private String appid;
    private String sub_appid;
    private String mch_id;
    private String sub_mch_id;
    private String nonce_str;
    private String sign;
    private String body;
    private String attach;
    private String out_trade_no;
    private String fee_type;
    private String total_fee;
    private String spbill_create_ip;
    private String time_start;
    private String time_expire;
    private String limit_pay;
    private String contract_code;
    private String promotion_tag;
    private String trade_type;
    private String notify_url;
    private String device_info;
    private String mini_app_param;
    private String openid;
}

  2.4新建controller包,新建PayController

  

package com.zhengyang.wxpay.controller;

import com.ijpay.core.enums.SignType;
import com.ijpay.core.enums.TradeType;
import com.ijpay.core.kit.WxPayKit;
import com.ijpay.wxpay.WxPayApi;
import com.zhengyang.wxpay.commons.MessageResult;
import com.zhengyang.wxpay.config.WxPayProperties;
import com.zhengyang.wxpay.pojo.JsApiOrderModel;
import com.zhengyang.wxpay.pojo.Order;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.Map;

/**
 * @Author: Hello World
 * @Date: 2021/7/2 17:21
 * @Description:微信支付控制器
 */
@RestController
public class PayController {
    @Autowired
    WxPayProperties wxPayProperties;
    /**
     * 小程序微信支付的第一步,统一下单
     *
     * @return
     * @author lantian
     * @time 2019年4月23日17:36:35
     */
    @GetMapping("/pay")
    public MessageResult createUnifiedOrder(String orderNum, HttpServletRequest request) {
        String ip = "127.0.0.1";
        //订单假数据,正式使用中可以通过订单号查询出订单,这里做测试使用
        Order order = new Order();
        order.setMoney(20);
        order.setOrderNum("12313145251");
        order.setOpenid("oV-3C4iM7Wo7B9IrRfCDT8rpsY0I");
        //价格
        BigDecimal money = new BigDecimal(order.getMoney());
        Map<String, String> params = JsApiOrderModel
                .builder()
                .appid(wxPayProperties.getAppId())
                .mch_id(wxPayProperties.getMchId())
                // 订单描述
                .nonce_str(order.getOrderNum())
                .body("微信支付")
                // 订单号
                .out_trade_no(order.getOrderNum())
                // 支付金额注意是以分为单位的
                .total_fee(String.valueOf((money.multiply(new BigDecimal("100"))).intValue()))
                //发起订单者ip
                .spbill_create_ip(ip)
                .notify_url(wxPayProperties.getNotifyUrl())
                .trade_type(TradeType.JSAPI.getTradeType())
                .openid(order.getOpenid())
                .build()
                .createSign(wxPayProperties.getMchKey(), SignType.MD5);
        //进行数据加密封装
        String xmlResult = WxPayApi.pushOrder(false, params);
        Map<String, String> resultMap = WxPayKit.xmlToMap(xmlResult);
        if (StringUtils.equals(resultMap.get("return_code"), "SUCCESS")) {
            String prepayId = resultMap.get("prepay_id");
            Map<String, String> packageParams = WxPayKit.prepayIdCreateSign(prepayId, wxPayProperties.getAppId(),
                    wxPayProperties.getMchKey(), SignType.MD5);
            // 微信浏览器中拿此参数调起支付
            return new MessageResult(200, "ok", packageParams);

        }
        return null;
    }
}

2.4启动测试

拿到了这一段数据就证明成功啦

2.5小程序唤起微信支付

在页面中onload方法,请求我们的接口

  onLoad:function(data){
    console.log(data)
    let options=wx.getStorageSync('form');
         //请求接口,从我们接口中获取交易信息获取保存到orderData中
         request({url: "/wx/pay?orderNum="+'174995757575'}).then((response)=>{
            this.setData({
              orderData:response
            })
     })
  pay(){
        let info=this.data.orderData;
       //如果订单中没有数据,则提示服务器异常
       if(info==undefined){
        wx.showModal({
          title:'提示',
          content:'服务器异常',
          success(res){
            if(res.confirm){
              console.log("确认")
            }else if(res.cancel){
              console.log("取消")
            }
          }
          
       })
       }else{
        //否则唤起微信支付
        wx.requestPayment({
            'timeStamp': info.timeStamp,
            'nonceStr': info.nonceStr,
            'package': info.package,
            'signType': 'MD5',
            'paySign': info.paySign,
            'appid':info.appId,
             //支付成功回调
            'success':function(res){
            console.log("支付成功"+res)
      
  
            },
             //支付失败回调
            'fail':function(res){
              wx.showModal({
                 title:'提示',
                 content:'支付失败',
                 success(res){
                   if(res.confirm){
                     console.log("确认")
                   }else if(res.cancel){
                     console.log("取消")
                   }
                 }
                 
              })
            }
         })
       }
      
  }

 按钮中绑定pay()事件

点击即可唤醒微信支付

2.6异步回调

/**
     * 微信回调接口
     */
    @PostMapping("/wxPayNotice")
    public Map<String, String> parseOrderNotifyResult(@RequestBody String xmlData) throws ParseException {
        Map<String, String> map = new HashMap<>();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("微信回调开始了");
        //这里我只进行了部分回调信息的保存,更多参数请查看微信支付官方api:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7&index=8
        Map<String, String> resultMap = WxPayKit.xmlToMap(xmlData);
        /*----------------------分割线,下面的是业务代码,根据自己业务进行修改--------------------------*/
        //订单成功业务处理
        if ("SUCCESS".equals(resultMap.get("result_code"))) {
            System.out.println(resultMap);
            //订单号
            String nonce_str = resultMap.get("nonce_str");
            System.out.println("执行具体业务");
        }
        /*----------------------分割线,业务结束--------------------------*/

        map.put("return_code", "SUCCESS");
        map.put("return_msg", "OK");
        return map;
    }

支付成功后触发(配置文件中异步回调地址一定要内网能够访问)


总结

以上就是今天要讲的内容,本文仅仅简单介绍了springboot整合IJpay进行微信支付的使用,关于调用支付jspi缺少参数:total_fee主要是因为1.金额为空 2.订单号重复 3.订单号为空

猜你喜欢

转载自blog.csdn.net/qq_37612049/article/details/118418721