최근 회사는 타사 결제 플랫폼인 JeePay와 연결하여 인터넷에 상대적으로 기사가 적은 것을 확인했습니다.WeChat 결제 연결에 대한 기사를 보내 드리겠습니다.Alipay는 동일하며 내부 매개 변수만 변경하면 됩니다. 공식 문서 주소: 시스템 소개 - Jiquan 문서 , 특정 서비스는 모든 사람이 내부에서 애플리케이션을 구축하고 생성해야 합니다.여기서는 코드만 보여줍니다.특정 서비스 구축 및 애플리케이션 생성에 대해서는 공식 웹 사이트로 이동하여 구현을 시작하십시오. 아래 코드.
먼저 두 가지 pom 종속성을 소개합니다.
<종속성> <groupId>com.github.wxpay</groupId> <artifactId>wxpay-sdk</artifactId> <version>0.0.3</version> </종속성 > < 종속성 > <groupId>com.jeequan</ groupId> <artifactId>jeepay-sdk-java</artifactId> <version>1.5.0</version> < /종속성>
다음으로 구성 파일에 관련 구성을 추가해야 하며 새 application-jee-pay.properties를 만들 수 있습니다.
#这个是回调的地址,一定要能访问到我们回调的IP上面,自定义
domain-name=http://120.29.172.100:8500
#这个固定写死
api-base=https://pay.vichel.com.cn/
#商户私钥
api-key=商户的私钥,如何获取看下面截图
#商户号,看下面截图
mch-no=M1670111111
#应用ID
app-id=1111b3f0e4b05e7111111111
#转账回调地址
wx-withdrawal=${domain-name}/wxPay/result/withdrawalCallback
#支付回调地址
wx-recharge=${domain-name}/wxPay/result/wxRechargeCallback
jeePay 운영 플랫폼을 열고 연결하려는 애플리케이션을 클릭하고 수정을 클릭하면 애플리케이션 ID와 판매자 번호가 있습니다. 바로 복사할 수 있습니다. 임의로 개인 키를 생성하고 저장을 클릭합니다.
기본 구성 클래스
package com.mart.web.pay;
import com.jeequan.jeepay.Jeepay;
import com.jeequan.jeepay.JeepayClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
/**
* JeePay配置相关
*/
@Configuration
//这里指定我们要读取的配置文件
@PropertySource("classpath:application-jee-pay.properties")
public class JeePayClientConfig {
@Autowired
private Environment config;
@Bean
public JeepayClient jeePayConfig(){
//地址
Jeepay.setApiBase(config.getProperty("api-base"));
//私钥
Jeepay.apiKey = config.getProperty("api-key");
//商户号
Jeepay.mchNo = config.getProperty("mch-no");
//应用ID
Jeepay.appId = config.getProperty("app-id");
JeepayClient jeepayClient = JeepayClient.getInstance(Jeepay.appId, Jeepay.apiKey, Jeepay.getApiBase());
return jeepayClient;
}
}
다음은 일부 지불 및 이체 작업 모듈입니다.예를 들었습니다.비즈니스 요구에 따라 매개 변수를 조정해야 합니다.위챗 미니 프로그램 결제 및 위챗 변경 이체 기능만 사용하면 됩니다. 판매자는 사용자의 WeChat 거스름돈으로 돈을 이체할 수 있습니다.
package com.mart.web.pay;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.jeequan.jeepay.Jeepay;
import com.jeequan.jeepay.JeepayClient;
import com.jeequan.jeepay.exception.JeepayException;
import com.jeequan.jeepay.model.PayOrderCreateReqModel;
import com.jeequan.jeepay.model.TransferOrderCreateReqModel;
import com.jeequan.jeepay.model.TransferOrderCreateResModel;
import com.jeequan.jeepay.request.PayOrderCreateRequest;
import com.jeequan.jeepay.request.TransferOrderCreateRequest;
import com.jeequan.jeepay.response.PayOrderCreateResponse;
import com.jeequan.jeepay.response.TransferOrderCreateResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
/**
*
* 支付转账核心操作功能模块
*/
@Slf4j
@Service
public class JeePayService {
@Autowired
private JeepayClient jeepayClient;
@Autowired
private Environment config;
/**
* 转账操作,转账到微信零钱(特别注意,下面转账的时候Jeepay一定要使用微信的主商户进行转账,如果使用的是子商户就会出现 {"code":9999,"msg":"微信子商户暂不支持转账业务"})
* @param openId 用户的openId
* @param amount 转账金额
* @param numberOn 转账订单号
* @return
*/
public Boolean withdrawal(String openId, BigDecimal amount,String numberOn) {
// 构建请求数据
TransferOrderCreateRequest request = new TransferOrderCreateRequest();
TransferOrderCreateReqModel model = new TransferOrderCreateReqModel();
// 商户号
model.setMchNo(Jeepay.mchNo);
// 应用ID
model.setAppId(Jeepay.appId);
// 商户订单号
model.setMchOrderNo(numberOn);
// 支付方式
model.setIfCode("wxpay");
// 入账方式
model.setEntryType("WX_CASH");
// 我们传入的是元,这里需要吧金额转成单位分
amount = amount.multiply(new BigDecimal("100"));
model.setAmount(amount.longValue());
// 币种,目前只支持cny
model.setCurrency("CNY");
model.setAccountNo(openId);
// 转账备注
model.setTransferDesc("测试转账操作");
// 异步通知地址
model.setNotifyUrl(config.getProperty("wx-withdrawal"));
// 商户扩展参数,回调时原样返回
model.setExtParam(numberOn);
request.setBizModel(model);
log.info("jeepay下单参数处理完毕,参数:[{}]", JSON.toJSONString(request));
try {
TransferOrderCreateResponse response = jeepayClient.execute(request);
// 下单成功
if (response.isSuccess(Jeepay.apiKey)) {
//转账成功
log.warn("转账成功:{}");
return true;
}
} catch (JeepayException e) {
log.error(e.getMessage());
}
log.warn("转账失败:{}");
return false;
}
/**
* 支付操作,我下面使用的是微信支付的
* @param Subject 商品标题
* @param body 描述
* @param openId 微信的OpenId或者是支付宝的用户ID
* @param amount 支付的金额 CNY
* @param numberOn 平台自己生成的随机订单号
* @return
*/
public String scanPay(String Subject,String body,String openId, BigDecimal amount,String numberOn) {
// 构建请求数据
PayOrderCreateRequest request = new PayOrderCreateRequest();
PayOrderCreateReqModel model = new PayOrderCreateReqModel();
// 商户号
model.setMchNo(Jeepay.mchNo);
// 应用ID
model.setAppId(Jeepay.appId);
// 商户订单号
model.setMchOrderNo(numberOn);
// 支付方式
model.setWayCode("WX_JSAPI");
amount = amount.multiply(new BigDecimal("100"));
// 金额,单位分
model.setAmount(amount.longValue());
// 币种,目前只支持cny
model.setCurrency("CNY");
// 发起支付请求客户端的IP地址
model.setClientIp(config.getProperty("ip-address"));
// 商品标题
model.setSubject(Subject);
// 商品描述
model.setBody(body);
// 异步通知地址
model.setNotifyUrl(config.getProperty("wx-recharge"));
// 渠道扩展参数 传OpenId
model.setChannelExtra("{\"openid\": \""+openId+"\"}");
// 商户扩展参数,回调时原样返回
model.setExtParam(numberOn);
request.setBizModel(model);
log.info("jeepay下单参数处理完毕,参数:[{}]", JSON.toJSONString(request));
try {
PayOrderCreateResponse response = jeepayClient.execute(request);
// 下单成功
if (response.isSuccess(Jeepay.apiKey)) {
String result = response.getData().getString("payData");
return result;
}
} catch (JeepayException e) {
log.error(e.getMessage());
}
return null;
}
}
콜백
package com.mart.web.controller;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.jeequan.jeepay.util.JeepayKit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.*;
/**
* 回调接收
* @author HayDen
* @date 2022-11-15
*/
@RestController
@RequestMapping("/wxPay/result")
@SentinelResource(value = "CallbackController")
public class CallbackController
{
@Autowired
private Environment config;
/**
* 转账回调
* @return
*/
@PostMapping("/withdrawalCallback")
public String withdrawalCallback(HttpServletRequest req) throws Exception
{
String result = "failure";
try {
Map<String, Object> map = getParamsMap(req);
//获取私钥
String apikey = config.getProperty("api-key");
//验签
if (chackSgin(map, apikey)) {
return result;
}
//提现成功
//获取订单号
String orderNumber = map.get("mchOrderNo").toString();
//提现金额
BigDecimal amount = new BigDecimal(map.get("amount").toString()).divide(new BigDecimal("100"),4,BigDecimal.ROUND_HALF_UP);
}
result = "success";
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 微信支付回调
* @return
*/
@PostMapping("/wxRechargeCallback")
public String wxRechargeCallback(HttpServletRequest req) throws Exception
{
String result = "failure";
try {
Map<String, Object> map = getParamsMap(req);
//获取私钥
String apikey = config.getProperty("api-key");
//验签
if (chackSgin(map, apikey)) {
return result;
}
//订单号
String orderNumber = map.get("mchOrderNo").toString();
//支付金额
BigDecimal amount = new BigDecimal(map.get("amount").toString()).divide(new BigDecimal("100"),4,BigDecimal.ROUND_HALF_UP);
//返回成功
result = "success";
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 回调验签
* @param map
* @param apikey
* @return
*/
private Boolean chackSgin(Map<String, Object> map, String apikey) {
Object sign = map.remove("sign");
String reSign = JeepayKit.getSign(map, apikey);
if (!Objects.equals(reSign, sign)) {
return true;
}
return false;
}
private Map<String, Object> getParamsMap(HttpServletRequest req) {
Map<String, String[]> requestMap = req.getParameterMap();
Map<String, Object> paramsMap = new HashMap<>();
requestMap.forEach((key, values) -> {
String strs = "";
for (String value : values) {
strs = strs + value;
}
paramsMap.put(key, strs);
});
return paramsMap;
}
}
자, 기본적으로 여기서 끝입니다. 궁금한 사항이 있으시면 메시지를 남겨주세요. 확인 후 최대한 빨리 답변해 드리겠습니다. 제안 사항이 있으면 가장 좋습니다. 앞으로 나오시면 됩니다. 만약 그것은 합리적입니다, 나는 확실히 첫 번째가 될 것입니다.시간 최적화 코드.