yeepay
易宝标准版支付 JAVA SDK (订单支付接口、单笔订单查询接口、单笔退款接口、单笔退款查询接口、单笔订单撤销接口)
仓库:
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
依赖:
<dependency>
<groupId>com.github.izerui</groupId>
<artifactId>yeepay</artifactId>
<version>1.1.0</version>
</dependency>
如何使用:
一、设置商户编号和商户秘钥:
通过静态方法调用、或者程序初始化方法中调用
YeepayEngine.setMerId("10000457067");
YeepayEngine.setMerSecret("U26po59182dV8d7654bo24o5z369408u4sQ3To9j6QuopAbo3gwj4h33mro4");
二、设置请求参数、并完成engine对象建立
可以将 engine 对象作为单例bean放入spring上下文中
YeepayEngine engine = new YeepayEngine();
或:
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.connectionPool(new ConnectionPool(5,5,TimeUnit.MINUTES))
.pingInterval(30,TimeUnit.SECONDS)
.readTimeout(15,TimeUnit.SECONDS)
.addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
.build();
YeepayEngine engine = new YeepayEngine(client);
三、调用接口示例
- 请求支付url
PayRequest request = new PayRequest();
request.setP5_Pid("35242111");
request.setP3_Amt("0.01");
request.setPd_FrpId("CCB-NET-B2C");
String url = engine.getPayURL(request);
- 订单查询
OrderQueryRequest request = new OrderQueryRequest();
request.setP2_Order("123");
OrderQueryResponse order = engine.queryOrder(request);
- 退款
RefundRequest request = new RefundRequest();
request.setP2_Order("222");
request.setP3_Amt("0.01");
request.setPb_TrxId("868855800142162B");
RefundResponse response = engine.refund(request);
- 退款查询
RefundQueryRequest request = new RefundQueryRequest();
request.setP2_Order("ddd");
request.setPb_TrxId("868855800142162B");
RefundQueryResponse response = engine.queryRefund(request);
- 取消订单
OrderCancelRequest request = new OrderCancelRequest();
request.setPb_TrxId("123");
OrderCancelResponse response = engine.cancelOrder(request);
注意: 该sdk为原生的易宝接口请求和返回封装,建议在使用时进行二次包装。并要注意非rpc内部接口的话进行安全性校验。
示例:
@Override
public String getPayUrl(String order,String amount,String productName,String callBackUrl,String info,FrpIdEnum channel) {
try {
PayRequest request = new PayRequest();
request.setP2_Order(order);
request.setP3_Amt(amount);
request.setP5_Pid(productName);
request.setP8_Url(callBackUrl);
request.setPa_MP(info);
if(channel!=null){
request.setPd_FrpId(channel.getValue());
}
recordService.recordRequest(request);
return engine.getPayURL(request);
}catch (YeepayException e){
throw new BusinessException(e.getMessage(),e.getErrCode());
}
}
@Override
public OrderQueryResponseVo queryOrder(String order) {
try {
OrderQueryRequest request = new OrderQueryRequest();
request.setP2_Order(order);
OrderQueryResponse response = engine.queryOrder(request);
switch (response.getR1_Code()) {
case "1":
if(response.getErrorMsg()!=null&&!"".equals(response.getErrorMsg())){
throw new BusinessException(response.getErrorMsg());
}
recordService.updateOrder(response);
return beanMapper.map(response, OrderQueryResponseVo.class);
case "50":
throw new BusinessException("订单不存在","UN_KNOWN_ORDER_ERROR");
default:
throw new BusinessException("发生错误,错误码:"+response.getR1_Code()+",请重试","ERROR");
}
}catch (YeepayException e){
throw new BusinessException(e.getMessage(),e.getErrCode());
}
}
@Override
public RefundResponseVo refund(String amount,String transactionId) {
try {
RefundRequest request = new RefundRequest();
request.setP3_Amt(amount);
request.setPb_TrxId(transactionId);
RefundResponse response = engine.refund(request);
switch (response.getR1_Code()) {
case "1":
return beanMapper.map(response, RefundResponseVo.class);
case "2":
throw new BusinessException("账户状态无效","ACCOUNT_STATUS_ERROR");
case "7":
throw new BusinessException("该订单不支持退款","UNREFUND_ERROR");
case "10":
throw new BusinessException("退款金额超限","TRANSFINITE_ERROR");
case "18":
throw new BusinessException("余额不足","LACK_FEE_ERROR");
case "50":
throw new BusinessException("订单不存在","UN_KNOWN_ORDER_ERROR");
case "55":
throw new BusinessException("历史退款未开通","REFUND_HISTORY_OPENED_ERROR");
case "6801":
throw new BusinessException("IP 限制","IP_ERROR");
case "900":
throw new BusinessException("保证金金额不足,请充值","MARGIN_LACK_FEE_ERROR");
case "526":
throw new BusinessException("订单未支付","UN_PAY_ERROR");
case "10803":
throw new BusinessException("出款功能关闭,不允许退款,请联系客户经理","NOT_ALLOW_REFUND_ERROR");
case "32":
throw new BusinessException("无此交易,请重新核实流水号","NO_TRAD_ERROR");
default:
throw new BusinessException("发生错误,错误码:"+response.getR1_Code()+",请重试","ERROR");
}
}catch (YeepayException e){
throw new BusinessException(e.getMessage(),e.getErrCode());
}
}
@Override
public RefundQueryResponseVo queryRefund(String refundOrder,String transactionId) {
try {
RefundQueryRequest request = new RefundQueryRequest();
request.setP2_Order(refundOrder);
request.setPb_TrxId(transactionId);
RefundQueryResponse response = engine.queryRefund(request);
switch (response.getR1_Code()) {
case "1":
return beanMapper.map(response, RefundQueryResponseVo.class);
case "-1":
throw new BusinessException("请求参数不合法:为空,或空字符串","PARAMS_ERROR");
case "-2":
throw new BusinessException("商户不存在","MER_ERROR");
case "-3":
throw new BusinessException("给定的流水号,没有对应的退款记录","REFUND_NOT_EXSIT_ERROR");
default:
throw new BusinessException("发生错误,错误码:"+response.getR1_Code()+",请重试","ERROR");
}
}catch (YeepayException e){
throw new BusinessException(e.getMessage(),e.getErrCode());
}
}
@Override
public void cancelOrder(String order) {
try {
OrderCancelRequest request = new OrderCancelRequest();
request.setPb_TrxId(order);
OrderCancelResponse response = engine.cancelOrder(request);
if(response.getR1_Code()==null){
throw new BusinessException("发生错误,错误码:"+response.getR1_Code()+",请重试","ERROR");
}else if(response.getR1_Code().equals("50")){
throw new BusinessException("订单不存在","UN_KNOWN_ORDER_ERROR");
}else if(response.getR1_Code().equals("53")){
throw new BusinessException("订单已经成功,不可撤销","ORDER_TRADED_ERROR");
}
if(response.getErrorMsg()!=null&&!"".equals(response.getErrorMsg())){
throw new BusinessException(response.getErrorMsg());
}
}catch (YeepayException e){
throw new BusinessException(e.getMessage(),e.getErrCode());
}
}