Commit 60fa1790 by YG8999

扫呗支付代码

parent 2ec5c75d
......@@ -8,6 +8,8 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import share.system.domain.vo.SaobeiNotifyResponseVo;
import share.system.domain.vo.SaobeiNotifyVo;
import share.system.service.CallbackService;
import javax.servlet.http.HttpServletRequest;
......@@ -49,6 +51,19 @@ public class CallbackController {
System.out.println("微信退款回调 response ===> " + response);
return response;
}
/**
* 扫呗支付回调
*/
@ApiOperation(value = "扫呗支付回调")
@RequestMapping(value = "/saobei/wechat", method = RequestMethod.POST)
public SaobeiNotifyResponseVo saobeiWechat(@RequestBody SaobeiNotifyVo request) {
System.out.println("扫呗支付回调 request ===> " + request);
SaobeiNotifyResponseVo response = callbackService.saobeiWechat(request);
System.out.println("扫呗支付回调 response ===> " + response);
return response;
}
}
......
package share.web.controller.system;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import share.common.annotation.Log;
import share.common.core.controller.BaseController;
import share.common.core.domain.AjaxResult;
import share.common.enums.BusinessType;
import share.system.domain.SaobeiApiLog;
import share.system.service.SaobeiApiLogService;
import share.common.utils.poi.ExcelUtil;
import share.common.core.page.TableDataInfo;
/**
* 扫呗接口调用日志Controller
*
* @author wuwenlong
* @date 2023-12-14
*/
@RestController
@RequestMapping("/system/saobei/log")
public class SaobeiApiLogController extends BaseController
{
@Autowired
private SaobeiApiLogService saobeiApiLogService;
/**
* 查询扫呗接口调用日志列表
*/
@PreAuthorize("@ss.hasPermi('system:saobeilog:list')")
@GetMapping("/list")
public TableDataInfo list(SaobeiApiLog saobeiApiLog)
{
startPage();
List<SaobeiApiLog> list = saobeiApiLogService.selectSaobeiApiLogList(saobeiApiLog);
return getDataTable(list);
}
/**
* 导出扫呗接口调用日志列表
*/
@PreAuthorize("@ss.hasPermi('system:saobeilog:export')")
@Log(title = "扫呗接口调用日志", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, SaobeiApiLog saobeiApiLog)
{
List<SaobeiApiLog> list = saobeiApiLogService.selectSaobeiApiLogList(saobeiApiLog);
ExcelUtil<SaobeiApiLog> util = new ExcelUtil<SaobeiApiLog>(SaobeiApiLog.class);
util.exportExcel(response, list, "扫呗接口调用日志数据");
}
/**
* 获取扫呗接口调用日志详细信息
*/
@PreAuthorize("@ss.hasPermi('system:saobeilog:query')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
return success(saobeiApiLogService.selectSaobeiApiLogById(id));
}
/**
* 新增扫呗接口调用日志
*/
@PreAuthorize("@ss.hasPermi('system:saobeilog:add')")
@Log(title = "扫呗接口调用日志", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody SaobeiApiLog saobeiApiLog)
{
return toAjax(saobeiApiLogService.insertSaobeiApiLog(saobeiApiLog));
}
/**
* 修改扫呗接口调用日志
*/
@PreAuthorize("@ss.hasPermi('system:saobeilog:edit')")
@Log(title = "扫呗接口调用日志", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody SaobeiApiLog saobeiApiLog)
{
return toAjax(saobeiApiLogService.updateSaobeiApiLog(saobeiApiLog));
}
/**
* 删除扫呗接口调用日志
*/
@PreAuthorize("@ss.hasPermi('system:saobeilog:remove')")
@Log(title = "扫呗接口调用日志", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids)
{
return toAjax(saobeiApiLogService.deleteSaobeiApiLogByIds(ids));
}
}
......@@ -30,6 +30,14 @@ wx:
token: coujio
aesKey: zf8vTHbI0ZDPTkkCXHEuwh9EbtVtOn6n4vQjMb9OFrS
msgDataFormat: XML
#扫呗支付配置
saobei:
key: 15490267
accessToken: a16f205455bb48b899ec38b9929c8962
instNo: 15490267
merchantNo: 852107997000216
terminalId: 15490267
payVer: 201
# 开发环境配置
server:
# 服务器的HTTP端口,默认为8080
......
package share.common.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @className: share.common.config.SaobeiConfig
* @description: 读取扫呗相关配置
* @author: lwj
* @create: 2023-12-13 12:05
*/
@Data
@Component
@ConfigurationProperties(prefix = "saobei")
public class SaobeiConfig {
//机构秘钥,扫呗分配
private String key;
//支付秘钥,扫呗分配
private String accessToken;
//机构号,扫呗分配
private String instNo;
//商户号,扫呗分配
private String merchantNo;
//终端号,扫呗分配
private String terminalId;
//版本号
private String payVer;
}
......@@ -44,4 +44,7 @@ public class PayConstants {
// 公共号退款
public static final String WX_PAY_REFUND_API_URI= "secapi/pay/refund";
// 扫呗支付回调地址
public static final String SAOBEI_PAY_NOTIFY_API_URI = "/prod-api/admin/payment/callback/saobei/wechat";
}
......@@ -9,7 +9,8 @@ import share.common.utils.StringUtils;
public enum PayTypeEnum {
WECHAT(1,"wechat","微信支付"),
ALIPAY(2,"alipay","支付宝");
ALIPAY(2,"alipay","支付宝"),
SAOBEI(3,"saobei","扫呗");
private Integer code;
private String value;
......
package share.common.enums;
import share.common.utils.StringUtils;
/**
* @className: share.common.enums.SaobeiPayTypeEnum
* @description: 扫呗支付类型
* @author: lwj
* @create: 2023-12-13 13:24
*/
public enum SaobeiPayTypeEnum {
WECHAT("010","wechat","微信"),
ALIPAY("020","alipay","支付宝");
private String code;
private String value;
private String name;
SaobeiPayTypeEnum(String code, String value, String name) {
this.code = code;
this.value = value;
this.name = name;
}
public String getCode(){
return code;
}
public String getValue() {
return value;
}
public String getName() {
return name;
}
}
package share.common.enums;
/**
* @className: share.common.enums.SaobeiServiceIdEnum
* @description: 扫呗服务接口类型
* @author: lwj
* @create: 2023-12-13 12:24
*/
public enum SaobeiServiceIdEnum {
SERVICE_ID_12("012", "公众号预支付(统一下单)"),
SERVICE_ID_15("015", "小程序支付接口"),
SERVICE_ID_30("030", "退款申请接口"),
SERVICE_ID_99("099", "扫呗回调接口");
private String code;
private String name;
SaobeiServiceIdEnum(String code, String name) {
this.code = code;
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package share.common.enums;
/**
* @className: share.common.enums.SaobeiStatusEnum
* @description: 扫呗支付返回状态
* @author: lwj
* @create: 2023-12-13 12:53
*/
public enum SaobeiStatusEnum {
SUCCESS("01", "成功"),
FAIL("02", "失败"),
EXCEPTION("00", "接口异常");
private String code;
private String name;
SaobeiStatusEnum(String code, String name) {
this.code = code;
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
......@@ -30,6 +30,14 @@ wx:
token: coujio
aesKey: zf8vTHbI0ZDPTkkCXHEuwh9EbtVtOn6n4vQjMb9OFrS
msgDataFormat: JSON
#扫呗支付配置
saobei:
key: 15490267
accessToken: a16f205455bb48b899ec38b9929c8962
instNo: 15490267
merchantNo: 852107997000216
terminalId: 15490267
payVer: 201
# 开发环境配置
server:
# 服务器的HTTP端口,默认为8080
......
......@@ -143,5 +143,13 @@
<version>5.8.16</version>
<scope>compile</scope>
</dependency>
<!--扫呗支付SDK引入加相关依赖结束-->
<dependency>
<groupId>saobei-open</groupId>
<artifactId>saobei-open</artifactId>
<version>1.1.8</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/lib/saobei-open-sdk-1.1.8.jar</systemPath>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package share.system.domain;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import share.common.annotation.Excel;
import share.common.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.Data;
/**
* 扫呗接口调用日志对象 s_saobei_api_log
*
* @author wuwenlong
* @date 2023-12-14
*/
@Data
public class SaobeiApiLog extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 主键id */
private Long id;
/** 版本号 */
@Excel(name = "版本号")
private String payVer;
/** 支付方式,010微信,020支付宝 */
@Excel(name = "支付方式,010微信,020支付宝")
private String payType;
/** 接口类型 */
@Excel(name = "接口类型")
private String serviceId;
/** 商户号 */
@Excel(name = "商户号")
private String merchantNo;
/** 终端号 */
@Excel(name = "终端号")
private String terminalId;
/** 用户手机端IP */
@Excel(name = "用户手机端IP")
private String terminalIp;
/** 终端流水号 */
@Excel(name = "终端流水号")
private String terminalTrace;
/** 终端交易时间 */
@Excel(name = "终端交易时间")
private String terminalTime;
/** 扫呗平台唯一订单号 */
@Excel(name = "扫呗平台唯一订单号")
private String outTradeNo;
/** 请求参数 */
@Excel(name = "请求参数")
private String requestParams;
/** 响应参数 */
@Excel(name = "响应参数")
private String responseParams;
/** 响应结果:01成功,02失败,00异常无响应 */
@Excel(name = "响应结果:01成功,02失败,00异常无响应")
private String result;
/** 响应结果描述 */
@Excel(name = "响应结果描述")
private String resultMsg;
/** 标记 */
@Excel(name = "标记")
private String flag;
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("payVer", getPayVer())
.append("payType", getPayType())
.append("serviceId", getServiceId())
.append("merchantNo", getMerchantNo())
.append("terminalId", getTerminalId())
.append("terminalIp", getTerminalIp())
.append("terminalTrace", getTerminalTrace())
.append("terminalTime", getTerminalTime())
.append("outTradeNo", getOutTradeNo())
.append("requestParams", getRequestParams())
.append("responseParams", getResponseParams())
.append("result", getResult())
.append("resultMsg", getResultMsg())
.append("createTime", getCreateTime())
.append("createBy", getCreateBy())
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.append("remark", getRemark())
.append("flag", getFlag())
.toString();
}
}
package share.system.domain.vo;
import lombok.Data;
import java.io.Serializable;
/**
* @className: share.system.domain.vo.SaobeiNotifyVo
* @description: 扫呗退款申请参数
* @author: lwj
* @create: 2023-12-13 16:09
*/
@Data
public class SaobeiMiniPayRequestVo implements Serializable {
// 接口内业务版本号,可用值201、202
private String pay_ver;
//支付方式:010微信,020 支付宝,060qq钱包,100翼支付,110云闪付
private String pay_type;
//接口类型,当前类型030
private String service_id;
//商户号
private String merchant_no;
// 终端号
private String terminal_id;
// 商户侧门店或者终端编号,请先与运营同事确认是否在扫呗平台配置过映射,若没有配置映射,请勿传值,否则支付会报错。
private String device_no;
// 用户手机端IP(IPV4格式 ,人行侧风控主要依据,请真实填写)
private String terminal_ip;
//终端流水号,此处传商户发起预支付或公众号支付时所传入的交易流水号
private String terminal_trace;
//终端交易时间,yyyyMMddHHmmss,全局统一时间格式(01时参与拼接)
private String terminal_time;
// 金额,单位分
private String total_fee;
// 传商户自己的小程序appid,微信支付时此参数必传。(即获取open_id所使用的appid)
private String sub_appid;
// 用户标识(微信openid,支付宝userid),pay_type为010及020时必填
private String open_id;
// 订单包含的商品列表信息,Json数组格式。pay_type为010,020时,可选填此字段
private String goods_detail;
//订单优惠标记,代金券或立减优惠功能的参数(字段值:cs和bld)
private String goods_tag;
// 订单描述,显示在订单详情页面,禁止使用+,空格,/,?,%,#,&,=这几类特殊符号
private String order_body;
// 外部系统通知地址
private String notify_url;
//附加数据,原样返回
private String attach;
// 优惠券串码
private String coupon_no;
// 优惠券凭证
private String coupon_credential;
// 微信门店编号和支付宝外部自定义门店编号,透传。微信对应scene_info(场景信息)中的门店id。 支付宝自定义门店编号不能随便传,在确认门店编号存在的情况下传值,否则影响支付
private String custom_store_id;
// 支付宝官方门店编号,透传
private String official_store_id;
// 微信点餐场景类型:
//qr_order(店内扫码点餐)、
//pre_order(预点到店自提)、home_delivery (外送到家)、direct_payment(直接付款)、
//other(其他)
//支付宝点餐场景类型:
//QR_FOOD_ORDER(点餐先付)、
//P_QR_FOOD_ORDER(点餐后付)、
//SELF_PICK(门店自提)、
//TAKE_OUT(餐饮外卖)
private String food_order_type;
//签名串
private String key_sign;
// JSAPI -JSAPI支付(或小程序支付), NATIVE -Native支付, APP -APP支付,MWEB--H5支付
private String trade_type;
}
package share.system.domain.vo;
import lombok.Data;
import java.io.Serializable;
/**
* @className: share.system.domain.vo.SaobeiNotifyVo
* @description: 扫呗回调响应
* @author: lwj
* @create: 2023-12-13 16:09
*/
@Data
public class SaobeiNotifyResponseVo implements Serializable {
//响应码:01成功 ,02失败,响应码仅代表通信状态,不代表业务结果
private String return_code;
//返回信息提示,“签名失败”,“参数格式校验错误"等
private String return_msg;
}
package share.system.domain.vo;
import lombok.Data;
import java.io.Serializable;
/**
* @className: share.system.domain.vo.SaobeiNotifyVo
* @description: 扫呗回调参数
* @author: lwj
* @create: 2023-12-13 16:09
*/
@Data
public class SaobeiNotifyVo implements Serializable {
// 接口内业务版本号,可用值201、202
private String pay_ver;
//响应码:01成功 ,02失败,响应码仅代表通信状态,不代表业务结果
private String return_code;
//返回信息提示,“签名失败”,“参数格式校验错误"等
private String return_msg;
//业务结果:01成功 ,02失败
private String result_code;
//支付方式:010微信,020 支付宝,060qq钱包,100翼支付,110云闪付
private String pay_type;
//付款方用户id,“微信openid”、“支付宝账户”、“qq号”等
private String user_id;
// 商户名称
private String merchant_name;
//商户号
private String merchant_no;
// 终端号
private String terminal_id;
// 商户侧门店或者终端编号,请先与运营同事确认是否在扫呗平台配置过映射,若没有配置映射,请勿传值,否则支付会报错。
private String device_no;
//终端流水号,此处传商户发起预支付或公众号支付时所传入的交易流水号
private String terminal_trace;
//终端交易时间,yyyyMMddHHmmss,全局统一时间格式(01时参与拼接)
private String terminal_time;
//当前支付终端流水号,与pay_time同时传递
private String pay_trace;
// 当前支付终端交易时间,yyyyMMddHHmmss,全局统一时间格式,与pay_trace同时传递
private String pay_time;
// 金额,单位分
private String total_fee;
// 支付完成时间,yyyyMMddHHmmss,全局统一时间格式
private String end_time;
// 平台唯一订单号
private String out_trade_no;
// 通道订单号,微信订单号、支付宝订单号等
private String channel_trade_no;
// 银行渠道订单号,微信支付时显示在支付成功页面的条码,可用作扫码查询和扫码退款时匹配,pay_ver为202时返回
private String channel_order_no;
//附加数据,原样返回
private String attach;
// 商家应结算金额,单位分
private String receipt_fee;
// 买家实付金额(分)pay_ver为202时返回
private String buyer_pay_fee;
// 平台优惠金额(分)pay_ver为202时返回
private String platform_discount_fee;
// 商家优惠金额(分)pay_ver为202时返回
private String merchant_discount_fee;
// 银行类型,采用字符串类型的银行标识
private String bank_type;
//本交易支付时使用的所有优惠券信息 ,单品优惠功能字段
private String promotion_detail;
//订单标题描述
private String order_body;
//签名串
private String key_sign;
}
package share.system.domain.vo;
import lombok.Data;
import java.io.Serializable;
/**
* @className: share.system.domain.vo.SaobeiNotifyVo
* @description: 扫呗退款申请参数
* @author: lwj
* @create: 2023-12-13 16:09
*/
@Data
public class SaobeiRefundVo implements Serializable {
// 接口内业务版本号,可用值201、202
private String pay_ver;
//支付方式:010微信,020 支付宝,060qq钱包,100翼支付,110云闪付
private String pay_type;
//接口类型,当前类型030
private String service_id;
//商户号
private String merchant_no;
// 终端号
private String terminal_id;
// 商户侧门店或者终端编号,请先与运营同事确认是否在扫呗平台配置过映射,若没有配置映射,请勿传值,否则支付会报错。
private String device_no;
//终端流水号,此处传商户发起预支付或公众号支付时所传入的交易流水号
private String terminal_trace;
//终端交易时间,yyyyMMddHHmmss,全局统一时间格式(01时参与拼接)
private String terminal_time;
//当前支付终端流水号,与pay_time同时传递
private String pay_trace;
// 当前支付终端交易时间,yyyyMMddHHmmss,全局统一时间格式,与pay_trace同时传递
private String pay_time;
// 退款金额,单位分
private String refund_fee;
// 是否允许订单重复,传1:不允许terminal_trace重复。传2:不允许terminal_trace+terminal_time重复,传0或不传:允许重复
private String repeated_trace;
// 平台唯一订单号
private String out_trade_no;
// 通道订单号,微信订单号、支付宝订单号等
private String channel_trade_no;
// 银行渠道订单号,微信支付时显示在支付成功页面的条码,可用作扫码查询和扫码退款时匹配,pay_ver为202时返回
private String channel_order_no;
//附加数据,原样返回
private String attach;
//签名串
private String key_sign;
}
package share.system.mapper;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import share.system.domain.SaobeiApiLog;
/**
* 扫呗接口调用日志Mapper接口
*
* @author wuwenlong
* @date 2023-12-14
*/
public interface SaobeiApiLogMapper extends BaseMapper<SaobeiApiLog>
{
/**
* 查询扫呗接口调用日志
*
* @param id 扫呗接口调用日志主键
* @return 扫呗接口调用日志
*/
public SaobeiApiLog selectSaobeiApiLogById(Long id);
/**
* 查询扫呗接口调用日志列表
*
* @param saobeiApiLog 扫呗接口调用日志
* @return 扫呗接口调用日志集合
*/
public List<SaobeiApiLog> selectSaobeiApiLogList(SaobeiApiLog saobeiApiLog);
/**
* 新增扫呗接口调用日志
*
* @param saobeiApiLog 扫呗接口调用日志
* @return 结果
*/
public int insertSaobeiApiLog(SaobeiApiLog saobeiApiLog);
/**
* 修改扫呗接口调用日志
*
* @param saobeiApiLog 扫呗接口调用日志
* @return 结果
*/
public int updateSaobeiApiLog(SaobeiApiLog saobeiApiLog);
/**
* 删除扫呗接口调用日志
*
* @param id 扫呗接口调用日志主键
* @return 结果
*/
public int deleteSaobeiApiLogById(Long id);
/**
* 批量删除扫呗接口调用日志
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteSaobeiApiLogByIds(Long[] ids);
}
package share.system.service;
import share.system.domain.vo.SaobeiNotifyResponseVo;
import share.system.domain.vo.SaobeiNotifyVo;
import javax.servlet.http.HttpServletRequest;
/**
......@@ -19,4 +22,12 @@ public interface CallbackService {
* @return String
*/
String weChatRefund(String request);
/**
* 扫呗-支付回调
* @param param 回调json
* @return String
*/
SaobeiNotifyResponseVo saobeiWechat(SaobeiNotifyVo param);
}
......@@ -11,9 +11,16 @@ import share.system.response.OrderPayResultResponse;
public interface OrderPayService {
/**
* 订单支付
* 订单支付(微信支付)
* @param sOrder 支付参数
* @return OrderPayResultResponse
*/
OrderPayResultResponse payment(SOrder sOrder);
/**
* 订单支付(扫呗-微信支付)
* @param sOrder 支付参数
* @return OrderPayResultResponse
*/
OrderPayResultResponse saobeiPayment(SOrder sOrder);
}
package share.system.service;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.IService;
import share.system.domain.SaobeiApiLog;
/**
* 扫呗接口调用日志Service接口
*
* @author wuwenlong
* @date 2023-12-14
*/
public interface SaobeiApiLogService extends IService<SaobeiApiLog>
{
/**
* 查询扫呗接口调用日志
*
* @param id 扫呗接口调用日志主键
* @return 扫呗接口调用日志
*/
public SaobeiApiLog selectSaobeiApiLogById(Long id);
/**
* 查询扫呗接口调用日志列表
*
* @param saobeiApiLog 扫呗接口调用日志
* @return 扫呗接口调用日志集合
*/
public List<SaobeiApiLog> selectSaobeiApiLogList(SaobeiApiLog saobeiApiLog);
/**
* 新增扫呗接口调用日志
*
* @param saobeiApiLog 扫呗接口调用日志
* @return 结果
*/
public int insertSaobeiApiLog(SaobeiApiLog saobeiApiLog);
/**
* 修改扫呗接口调用日志
*
* @param saobeiApiLog 扫呗接口调用日志
* @return 结果
*/
public int updateSaobeiApiLog(SaobeiApiLog saobeiApiLog);
/**
* 批量删除扫呗接口调用日志
*
* @param ids 需要删除的扫呗接口调用日志主键集合
* @return 结果
*/
public int deleteSaobeiApiLogByIds(Long[] ids);
/**
* 删除扫呗接口调用日志信息
*
* @param id 扫呗接口调用日志主键
* @return 结果
*/
public int deleteSaobeiApiLogById(Long id);
}
package share.system.service;
import com.saobei.open.sdk.model.response.trade.SaobeiMiniPayResponse;
import com.saobei.open.sdk.model.response.trade.SaobeiTradeRefundResponse;
import share.system.domain.vo.CreateOrderRequestVo;
import share.system.domain.vo.SaobeiMiniPayRequestVo;
import share.system.domain.vo.SaobeiRefundVo;
/**
* @className: share.system.service.SaobeiService
* @description: 扫呗支付公共接口
* @author: lwj
* @create: 2023-12-13 11:53
*/
public interface SaobeiService {
/**
* 扫呗支付-微信
* @param saobeiMiniPayRequestVo
* @return
*/
SaobeiMiniPayResponse wechatMinipay(SaobeiMiniPayRequestVo saobeiMiniPayRequestVo);
/**
* 扫呗退款-微信
* @param vo 退款参数
* @return
*/
SaobeiTradeRefundResponse refund(SaobeiRefundVo vo);
}
......@@ -3,10 +3,12 @@ package share.system.service.impl;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.saobei.open.sdk.model.response.trade.SaobeiMiniPayResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import share.common.config.SaobeiConfig;
import share.common.config.WeChatConfig;
import share.common.constant.Constants;
import share.common.constant.PayConstants;
......@@ -19,16 +21,10 @@ import share.common.utils.DateUtil;
import share.common.utils.JsonConvertUtil;
import share.system.domain.SConsumerToken;
import share.system.domain.SOrder;
import share.system.domain.vo.AttachVo;
import share.system.domain.vo.CreateOrderRequestVo;
import share.system.domain.vo.CreateOrderResponseVo;
import share.system.domain.vo.WxPayJsResultVo;
import share.system.domain.vo.*;
import share.system.request.OrderPayRequest;
import share.system.response.OrderPayResultResponse;
import share.system.service.ISOrderService;
import share.system.service.OrderPayService;
import share.system.service.SConsumerTokenService;
import share.system.service.WechatNewService;
import share.system.service.*;
import share.system.util.WxPayUtil;
import java.math.BigDecimal;
......@@ -44,6 +40,8 @@ public class OrderPayServiceImpl implements OrderPayService {
@Autowired
private WeChatConfig weChatConfig;
@Autowired
private SaobeiConfig saobeiConfig;
@Autowired
private SConsumerTokenService consumerTokenService;
......@@ -54,6 +52,9 @@ public class OrderPayServiceImpl implements OrderPayService {
@Autowired
private ISOrderService orderService;
@Autowired
private SaobeiService saobeiService;
@Override
public OrderPayResultResponse payment(SOrder sOrder) {
OrderPayResultResponse response = new OrderPayResultResponse();
......@@ -75,6 +76,28 @@ public class OrderPayServiceImpl implements OrderPayService {
return response;
}
@Override
public OrderPayResultResponse saobeiPayment(SOrder sOrder) {
OrderPayResultResponse response = new OrderPayResultResponse();
response.setOrderNo(sOrder.getOrderNo());
response.setPayType(PayTypeEnum.getEnumByCode(sOrder.getPayType()).getValue());
response.setStatus(YesNoEnum.no.getFlag());
// 扫呗支付
ConcurrentHashMap<String, String> unifiedorder = saobeiUnifiedOrder(sOrder);
WxPayJsResultVo vo = new WxPayJsResultVo();
vo.setAppId(unifiedorder.get("appId"));
vo.setNonceStr(unifiedorder.get("nonceStr"));
vo.setPackages(unifiedorder.get("package"));
vo.setSignType(unifiedorder.get("signType"));
vo.setTimeStamp(unifiedorder.get("timeStamp"));
vo.setPaySign(unifiedorder.get("paySign"));
// 更新商户订单号
sOrder.setOutTradeNo(unifiedorder.get("outTradeNo"));
orderService.updateById(sOrder);
response.setJsConfig(vo);
return response;
}
/**
* 预下单
......@@ -100,7 +123,7 @@ public class OrderPayServiceImpl implements OrderPayService {
// 组装前端预下单参数
ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
map.put("appId", unifiedorderVo.getAppid());
map.put("nonceStr", unifiedorderVo.getAppid());
map.put("nonceStr", unifiedorderVo.getNonce_str());
map.put("package", "prepay_id=".concat(responseVo.getPrepayId()));
map.put("signType", unifiedorderVo.getSign_type());
Long currentTimestamp = WxPayUtil.getCurrentTimestamp();
......@@ -141,4 +164,65 @@ public class OrderPayServiceImpl implements OrderPayService {
return vo;
}
/**
* 预下单 (扫呗-微信)
* @param sOrder 订单
* @return 预下单返回对象
*/
private ConcurrentHashMap<String, String> saobeiUnifiedOrder(SOrder sOrder) {
// 获取用户openId
SConsumerToken userToken = consumerTokenService.getTokenByUserId(sOrder.getConsumerId());
if (ObjectUtil.isNull(userToken)) {
throw new BaseException("该用户没有openId");
}
// 获取appid、mch_id
// 微信签名key
String appId = weChatConfig.getAppId();
String mchId = weChatConfig.getMchId();
String signKey = weChatConfig.getSignKey();
// 获取扫呗微信预下单对象
SaobeiMiniPayRequestVo unifiedorderVo = getSaobeiUnifiedOrderVo(sOrder, userToken.getToken(), appId, mchId, signKey);
// 预下单(统一下单)
SaobeiMiniPayResponse response = saobeiService.wechatMinipay(unifiedorderVo);
logger.info("SaobeiMiniPayResponse :", JsonConvertUtil.write2JsonStr(response));
// 组装前端预下单参数
ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
map.put("appId", response.getAppId());
map.put("nonceStr", response.getNonceStr());
map.put("package", response.getPackage_str());
map.put("signType", response.getSignType());
map.put("timeStamp", response.getTimeStamp());
map.put("paySign", response.getPaySign());
map.put("prepayTime", DateUtil.nowDateTimeStr());
map.put("outTradeNo", unifiedorderVo.getTerminal_trace());
return map;
}
/**
* 获取预下单对象 (扫呗-微信)
* @return 预下单对象
*/
private SaobeiMiniPayRequestVo getSaobeiUnifiedOrderVo(SOrder sOrder, String openid, String appId, String mchId, String signKey) {
// 获取域名
String apiDomain = Constants.CONFIG_KEY_API_URL;
AttachVo attachVo = new AttachVo(OrderTypeEnum.getEnumByCode(sOrder.getOrderType()).getValue(), sOrder.getConsumerId());
SaobeiMiniPayRequestVo vo = new SaobeiMiniPayRequestVo();
vo.setSub_appid(appId);
vo.setMerchant_no(saobeiConfig.getMerchantNo());
vo.setTerminal_id(saobeiConfig.getTerminalId());
vo.setAttach(JSONObject.toJSONString(attachVo));
vo.setTerminal_trace(BaseUtil.getOrderNo("WXNO"));
vo.setTerminal_time(DateUtil.nowDate(Constants.DATE_TIME_FORMAT_NUM));
vo.setOrder_body(StrUtil.concat(true,sOrder.getTimeLong(),"小时麻将房畅玩!"));
// 订单中使用的是BigDecimal,这里要转为Integer类型
vo.setTotal_fee(String.valueOf(sOrder.getPayPrice().multiply(BigDecimal.TEN).multiply(BigDecimal.TEN).intValue()));
vo.setNotify_url(apiDomain + PayConstants.SAOBEI_PAY_NOTIFY_API_URI);
vo.setTrade_type(PayConstants.WX_PAY_TRADE_TYPE_JS);
vo.setOpen_id(openid);
vo.setDevice_no("WEB");
return vo;
}
}
package share.system.service.impl;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.saobei.open.sdk.model.response.trade.SaobeiTradeRefundResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import share.common.config.WeChatConfig;
import share.common.constant.Constants;
import share.common.constant.PayConstants;
import share.common.enums.YesNoEnum;
import share.common.core.redis.RedisUtil;
import share.common.enums.*;
import share.common.exception.base.BaseException;
import share.common.utils.BaseUtil;
import share.common.utils.DateUtil;
import share.common.utils.http.RestTemplateUtil;
import share.system.domain.SConsumptionRecords;
import share.system.domain.SOrder;
import share.system.domain.WechatPayInfo;
import share.system.domain.vo.SaobeiRefundVo;
import share.system.domain.vo.WxRefundVo;
import share.system.mapper.SOrderMapper;
import share.system.mapper.WechatPayInfoMapper;
import share.system.request.OrderRefundRequest;
import share.system.service.ISysConfigService;
import share.system.service.OrderRefundService;
import share.system.service.WechatNewService;
import share.system.service.*;
import share.system.util.WxPayUtil;
import java.math.BigDecimal;
......@@ -26,16 +35,21 @@ import java.math.BigDecimal;
public class OrderRefundServiceImpl extends ServiceImpl<SOrderMapper, SOrder> implements OrderRefundService {
@Autowired
private ISysConfigService sysConfigService;
private SaobeiService saobeiService;
@Autowired
private RestTemplateUtil restTemplateUtil;
private WechatPayInfoService wechatPayInfoService;
@Autowired
private WechatNewService wechatNewService;
@Autowired
private RedisUtil redisUtil;
@Autowired
private WeChatConfig weChatConfig;
@Autowired
private ISOrderService sOrderService;
@Autowired
private ISConsumptionRecordsService sConsumptionRecordsService;
/**
* 退款 需要优化
......@@ -44,7 +58,9 @@ public class OrderRefundServiceImpl extends ServiceImpl<SOrderMapper, SOrder> im
*/
@Override
public void refund(OrderRefundRequest request, SOrder sOrder) {
refundWx(request, sOrder);
// refundWx(request, sOrder);
// 扫呗-微信退款
refundSaobei(request, sOrder);
}
/**
......@@ -76,5 +92,54 @@ public class OrderRefundServiceImpl extends ServiceImpl<SOrderMapper, SOrder> im
wxRefundVo.setSign(sign);
wechatNewService.payRefund(wxRefundVo, path);
}
/**
* 扫呗退款-微信
* @param request
* @param sOrder
*/
private void refundSaobei(OrderRefundRequest request, SOrder sOrder) {
WechatPayInfo wechatPayInfo = wechatPayInfoService.getByNo(sOrder.getOutTradeNo());
if (ObjectUtil.isNull(wechatPayInfo)) {
throw new BaseException("微信订单不存在!");
}
SaobeiRefundVo vo = new SaobeiRefundVo();
vo.setRefund_fee(String.valueOf(request.getAmount().multiply(BigDecimal.TEN).multiply(BigDecimal.TEN).intValue()));
vo.setTerminal_trace(BaseUtil.getOrderNo("WXNO"));
vo.setTerminal_time(DateUtil.nowDate(Constants.DATE_TIME_FORMAT_NUM));
vo.setOut_trade_no(wechatPayInfo.getTransactionId());
SaobeiTradeRefundResponse response = saobeiService.refund(vo);
if (ObjectUtil.isNotEmpty(response)) {
// 退款成功修改订单状态
SOrder order = sOrderService.getByOrderNo(sOrder.getOrderNo());
if (ObjectUtil.isNull(order)) {
throw new BaseException("退款订单不存在");
}
order.setStatus(OrderStatusEnum.CANCEL.getCode());
order.setRefundStatus(RefundStatusEnum.REFUNDED.getCode());
order.setRefundReasonTime(cn.hutool.core.date.DateUtil.date());
order.setRefundPrice(request.getAmount());
order.setRefundReason(request.getRefundReason());
boolean update = sOrderService.updateById(order);
SConsumptionRecords sConsumptionRecords = new SConsumptionRecords();
sConsumptionRecords.setConsumerId(order.getConsumerId());
sConsumptionRecords.setOrderId(order.getId());
sConsumptionRecords.setName(ConsumeNameEnum.REFUND.getValue());
sConsumptionRecords.setPrice(order.getPayPrice());
sConsumptionRecords.setPayType(PayTypeEnum.WECHAT.getName());
sConsumptionRecords.setSign(SignEnum.STRAINHT.getValue());
sConsumptionRecordsService.insertSConsumptionRecords(sConsumptionRecords);
if (update) {
// 退款task,定时任务退优惠券
redisUtil.lPush(Constants.ORDER_TASK_REDIS_KEY_AFTER_REFUND_BY_USER, order.getId());
} else {
throw new BaseException("退款失败");
}
} else {
throw new BaseException("退款失败");
}
}
}
......@@ -313,7 +313,9 @@ public class SOrderServiceImpl extends ServiceImpl<SOrderMapper, SOrder> impleme
sOrder.setPayStatus(YesNoEnum.yes.getIndex());
sOrder.setPayTime(DateUtils.getNowDate());
} else {
response = orderPayService.payment(sOrder);
// response = orderPayService.payment(sOrder);
// 扫呗聚合支付
response = orderPayService.saobeiPayment(sOrder);
// 加入自动未支付自动取消队列
redisUtil.lPush(Constants.ORDER_AUTO_CANCEL_KEY, sOrder.getOrderNo());
}
......@@ -768,26 +770,28 @@ public class SOrderServiceImpl extends ServiceImpl<SOrderMapper, SOrder> impleme
throw new BaseException("微信申请退款失败!");
}
}
//修改订单退款状态,为退款中
sOrder.setRefundStatus(RefundStatusEnum.INREFUND.getCode());
sOrder.setRefundPrice(request.getAmount());
Boolean execute = Boolean.FALSE;
try {
sOrder.setRefundReason(request.getRefundReason());
updateById(sOrder);
//微信退款
if (sOrder.getPayType().equals(PayTypeEnum.WECHAT.getCode()) && request.getAmount().compareTo(BigDecimal.ZERO) == 0) {
// 退款task, 定时任务退优惠券
redisUtil.lPush(Constants.ORDER_TASK_REDIS_KEY_AFTER_REFUND_BY_USER, sOrder.getId());
}
execute = Boolean.TRUE;
} catch (Exception e) {
logger.error(e.toString());
}
if (!execute) {
throw new BaseException("订单更新失败");
}
return execute;
//修改订单退款状态,退款成功
// sOrder.setStatus(OrderStatusEnum.CANCEL.getCode());
// sOrder.setRefundStatus(RefundStatusEnum.REFUNDED.getCode());
// sOrder.setRefundReasonTime(cn.hutool.core.date.DateUtil.date());
// sOrder.setRefundPrice(request.getAmount());
// Boolean execute = Boolean.FALSE;
// try {
// sOrder.setRefundReason(request.getRefundReason());
// updateById(sOrder);
// //微信退款
// if (sOrder.getPayType().equals(PayTypeEnum.WECHAT.getCode()) && request.getAmount().compareTo(BigDecimal.ZERO) == 0) {
// // 退款task, 定时任务退优惠券
// redisUtil.lPush(Constants.ORDER_TASK_REDIS_KEY_AFTER_REFUND_BY_USER, sOrder.getId());
// }
// execute = Boolean.TRUE;
// } catch (Exception e) {
// logger.error(e.toString());
// }
// if (!execute) {
// throw new BaseException("订单更新失败");
// }
return Boolean.TRUE;
}
@Override
......
package share.system.service.impl;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import share.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import share.system.mapper.SaobeiApiLogMapper;
import share.system.domain.SaobeiApiLog;
import share.system.service.SaobeiApiLogService;
/**
* 扫呗接口调用日志Service业务层处理
*
* @author wuwenlong
* @date 2023-12-14
*/
@Service
public class SaobeiApiLogServiceImpl extends ServiceImpl<SaobeiApiLogMapper, SaobeiApiLog> implements SaobeiApiLogService
{
@Autowired
private SaobeiApiLogMapper saobeiApiLogMapper;
/**
* 查询扫呗接口调用日志
*
* @param id 扫呗接口调用日志主键
* @return 扫呗接口调用日志
*/
@Override
public SaobeiApiLog selectSaobeiApiLogById(Long id)
{
return saobeiApiLogMapper.selectSaobeiApiLogById(id);
}
/**
* 查询扫呗接口调用日志列表
*
* @param saobeiApiLog 扫呗接口调用日志
* @return 扫呗接口调用日志
*/
@Override
public List<SaobeiApiLog> selectSaobeiApiLogList(SaobeiApiLog saobeiApiLog)
{
return saobeiApiLogMapper.selectSaobeiApiLogList(saobeiApiLog);
}
/**
* 新增扫呗接口调用日志
*
* @param saobeiApiLog 扫呗接口调用日志
* @return 结果
*/
@Override
public int insertSaobeiApiLog(SaobeiApiLog saobeiApiLog)
{
saobeiApiLog.setCreateTime(DateUtils.getNowDate());
return saobeiApiLogMapper.insertSaobeiApiLog(saobeiApiLog);
}
/**
* 修改扫呗接口调用日志
*
* @param saobeiApiLog 扫呗接口调用日志
* @return 结果
*/
@Override
public int updateSaobeiApiLog(SaobeiApiLog saobeiApiLog)
{
saobeiApiLog.setUpdateTime(DateUtils.getNowDate());
return saobeiApiLogMapper.updateSaobeiApiLog(saobeiApiLog);
}
/**
* 批量删除扫呗接口调用日志
*
* @param ids 需要删除的扫呗接口调用日志主键
* @return 结果
*/
@Override
public int deleteSaobeiApiLogByIds(Long[] ids)
{
return saobeiApiLogMapper.deleteSaobeiApiLogByIds(ids);
}
/**
* 删除扫呗接口调用日志信息
*
* @param id 扫呗接口调用日志主键
* @return 结果
*/
@Override
public int deleteSaobeiApiLogById(Long id)
{
return saobeiApiLogMapper.deleteSaobeiApiLogById(id);
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="share.system.mapper.SaobeiApiLogMapper">
<resultMap type="SaobeiApiLog" id="SaobeiApiLogResult">
<result property="id" column="id" />
<result property="payVer" column="pay_ver" />
<result property="payType" column="pay_type" />
<result property="serviceId" column="service_id" />
<result property="merchantNo" column="merchant_no" />
<result property="terminalId" column="terminal_id" />
<result property="terminalIp" column="terminal_ip" />
<result property="terminalTrace" column="terminal_trace" />
<result property="terminalTime" column="terminal_time" />
<result property="outTradeNo" column="out_trade_no" />
<result property="requestParams" column="request_params" />
<result property="responseParams" column="response_params" />
<result property="result" column="result" />
<result property="resultMsg" column="result_msg" />
<result property="createTime" column="create_time" />
<result property="createBy" column="create_by" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="remark" column="remark" />
<result property="flag" column="flag" />
</resultMap>
<sql id="selectSaobeiApiLogVo">
select id, pay_ver, pay_type, service_id, merchant_no, terminal_id, terminal_ip, terminal_trace, terminal_time, out_trade_no, request_params, response_params, result, result_msg, create_time, create_by, update_by, update_time, remark, flag from s_saobei_api_log
</sql>
<select id="selectSaobeiApiLogList" parameterType="SaobeiApiLog" resultMap="SaobeiApiLogResult">
<include refid="selectSaobeiApiLogVo"/>
<where>
<if test="payVer != null and payVer != ''"> and pay_ver = #{payVer}</if>
<if test="payType != null and payType != ''"> and pay_type = #{payType}</if>
<if test="serviceId != null and serviceId != ''"> and service_id = #{serviceId}</if>
<if test="merchantNo != null and merchantNo != ''"> and merchant_no = #{merchantNo}</if>
<if test="terminalId != null and terminalId != ''"> and terminal_id = #{terminalId}</if>
<if test="terminalIp != null and terminalIp != ''"> and terminal_ip = #{terminalIp}</if>
<if test="terminalTrace != null and terminalTrace != ''"> and terminal_trace = #{terminalTrace}</if>
<if test="terminalTime != null and terminalTime != ''"> and terminal_time = #{terminalTime}</if>
<if test="outTradeNo != null and outTradeNo != ''"> and out_trade_no = #{outTradeNo}</if>
<if test="requestParams != null and requestParams != ''"> and request_params = #{requestParams}</if>
<if test="responseParams != null and responseParams != ''"> and response_params = #{responseParams}</if>
<if test="result != null and result != ''"> and result = #{result}</if>
<if test="resultMsg != null and resultMsg != ''"> and result_msg = #{resultMsg}</if>
<if test="flag != null and flag != ''"> and flag = #{flag}</if>
</where>
</select>
<select id="selectSaobeiApiLogById" parameterType="Long" resultMap="SaobeiApiLogResult">
<include refid="selectSaobeiApiLogVo"/>
where id = #{id}
</select>
<insert id="insertSaobeiApiLog" parameterType="SaobeiApiLog" useGeneratedKeys="true" keyProperty="id">
insert into s_saobei_api_log
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="payVer != null">pay_ver,</if>
<if test="payType != null">pay_type,</if>
<if test="serviceId != null">service_id,</if>
<if test="merchantNo != null">merchant_no,</if>
<if test="terminalId != null">terminal_id,</if>
<if test="terminalIp != null">terminal_ip,</if>
<if test="terminalTrace != null">terminal_trace,</if>
<if test="terminalTime != null">terminal_time,</if>
<if test="outTradeNo != null">out_trade_no,</if>
<if test="requestParams != null">request_params,</if>
<if test="responseParams != null">response_params,</if>
<if test="result != null">result,</if>
<if test="resultMsg != null">result_msg,</if>
<if test="createTime != null">create_time,</if>
<if test="createBy != null">create_by,</if>
<if test="updateBy != null">update_by,</if>
<if test="updateTime != null">update_time,</if>
<if test="remark != null">remark,</if>
<if test="flag != null">flag,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="payVer != null">#{payVer},</if>
<if test="payType != null">#{payType},</if>
<if test="serviceId != null">#{serviceId},</if>
<if test="merchantNo != null">#{merchantNo},</if>
<if test="terminalId != null">#{terminalId},</if>
<if test="terminalIp != null">#{terminalIp},</if>
<if test="terminalTrace != null">#{terminalTrace},</if>
<if test="terminalTime != null">#{terminalTime},</if>
<if test="outTradeNo != null">#{outTradeNo},</if>
<if test="requestParams != null">#{requestParams},</if>
<if test="responseParams != null">#{responseParams},</if>
<if test="result != null">#{result},</if>
<if test="resultMsg != null">#{resultMsg},</if>
<if test="createTime != null">#{createTime},</if>
<if test="createBy != null">#{createBy},</if>
<if test="updateBy != null">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="remark != null">#{remark},</if>
<if test="flag != null">#{flag},</if>
</trim>
</insert>
<update id="updateSaobeiApiLog" parameterType="SaobeiApiLog">
update s_saobei_api_log
<trim prefix="SET" suffixOverrides=",">
<if test="payVer != null">pay_ver = #{payVer},</if>
<if test="payType != null">pay_type = #{payType},</if>
<if test="serviceId != null">service_id = #{serviceId},</if>
<if test="merchantNo != null">merchant_no = #{merchantNo},</if>
<if test="terminalId != null">terminal_id = #{terminalId},</if>
<if test="terminalIp != null">terminal_ip = #{terminalIp},</if>
<if test="terminalTrace != null">terminal_trace = #{terminalTrace},</if>
<if test="terminalTime != null">terminal_time = #{terminalTime},</if>
<if test="outTradeNo != null">out_trade_no = #{outTradeNo},</if>
<if test="requestParams != null">request_params = #{requestParams},</if>
<if test="responseParams != null">response_params = #{responseParams},</if>
<if test="result != null">result = #{result},</if>
<if test="resultMsg != null">result_msg = #{resultMsg},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="createBy != null">create_by = #{createBy},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="remark != null">remark = #{remark},</if>
<if test="flag != null">flag = #{flag},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteSaobeiApiLogById" parameterType="Long">
delete from s_saobei_api_log where id = #{id}
</delete>
<delete id="deleteSaobeiApiLogByIds" parameterType="String">
delete from s_saobei_api_log where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment