系列文章目录
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
微信支付适用于许多场合,如小程序、网页支付、但微信支付相对于其他支付方式略显麻烦,我们使用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.订单号为空