增加注释,帮助文档

This commit is contained in:
egzosn
2017-03-12 15:22:26 +08:00
parent 4daef9bdaa
commit e6740d8b6d
16 changed files with 434 additions and 61 deletions

View File

@@ -31,7 +31,9 @@
测试链接 http://pay.egan.in/index.html
详细使用与简单教程请看 [pay-java-demo](pay-java-demo?dir=1&filepath=pay-java-demo)
服务端+网页端详细使用与简单教程请看 [pay-java-demo](pay-java-demo?dir=1&filepath=pay-java-demo)
android 案例 [pay-java-demo](http://git.oschina.net/egzosn/pay-java-android)
##交流
很希望更多志同道合友友一起扩展新的的支付接口。

View File

@@ -35,11 +35,23 @@ import java.util.*;
public class AliPayService extends BasePayService {
protected final Log log = LogFactory.getLog(AliPayService.class);
// private String httpsReqUrl = "https://openapi.alipay.com/gateway.do";
private String httpsReqUrl = "https://openapi.alipaydev.com/gateway.do";
//正式测试环境
private String httpsReqUrl = "https://openapi.alipay.com/gateway.do";
//沙箱测试环境账号
private String devReqUrl = "https://openapi.alipaydev.com/gateway.do";
//兼容上一版本即时收款
private String httpsReqUrlBefore = "https://mapi.alipay.com/gateway.do";
/**
* 获取对应的请求地址
* @return
*/
public String getReqUrl(){
return payConfigStorage.isTest() ? devReqUrl : httpsReqUrl;
}
public AliPayService(PayConfigStorage payConfigStorage, HttpConfigStorage configStorage) {
super(payConfigStorage, configStorage);
}
@@ -50,7 +62,7 @@ public class AliPayService extends BasePayService {
public String getHttpsVerifyUrl() {
return httpsReqUrl + "?service=notify_verify";
return getReqUrl() + "?service=notify_verify";
}
@Override
@@ -105,11 +117,6 @@ public class AliPayService extends BasePayService {
parameters.put("sign_type", payConfigStorage.getSignType());
String sign = createSign( SignUtils.parameterText(parameters, "&", "sign"), payConfigStorage.getInputCharset());
/* try {
sign = URLEncoder.encode(sign, payConfigStorage.getInputCharset());
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}*/
parameters.put("sign", sign);
return parameters;
}
@@ -124,17 +131,6 @@ public class AliPayService extends BasePayService {
@Override
public Map<String, Object> orderInfo(PayOrder order) {
/* Map<String, Object> orderInfo = getOrder(order);
String sign = createSign( SignUtils.parameterText(orderInfo, "&"), "UTF-8");
try {
sign = URLEncoder.encode(sign, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
orderInfo.put("sign", sign);
orderInfo.put("sign_type", payConfigStorage.getSignType());*/
return setSign(getOrder(order));
}
@@ -149,19 +145,12 @@ public class AliPayService extends BasePayService {
*/
private Map<String, Object> getOrder(PayOrder order) {
//兼容上一版本
//兼容上一版本 即时收款
/* if (AliTransactionType.DIRECT == order.getTransactionType() || AliTransactionType.MOBILE == order.getTransactionType() || AliTransactionType.WAPPAY == order.getTransactionType()){
return getOrderBefore(order);
}
*/
/* Map<String, Object> orderInfo = new TreeMap<>();
orderInfo.put("app_id", payConfigStorage.getAppid());
orderInfo.put("method", order.getTransactionType().getType());
orderInfo.put("charset", payConfigStorage.getInputCharset());
DateFormat formatter = DateFormat.getDateTimeInstance();
orderInfo.put("timestamp", formatter.format( new Date()));
orderInfo.put("version", "1.0");*/
Map<String, Object> orderInfo = getPublicParameters(order.getTransactionType());
orderInfo.put("notify_url", payConfigStorage.getNotifyUrl());
@@ -313,7 +302,7 @@ public class AliPayService extends BasePayService {
} else {
String biz_content = (String)orderInfo.remove("biz_content");
formHtml.append(httpsReqUrl).append("?").append(ClientHttpRequest.getMapToParameters(orderInfo))
formHtml.append(getReqUrl()).append("?").append(ClientHttpRequest.getMapToParameters(orderInfo))
.append("\" method=\"")
.append(method.name().toLowerCase()).append("\">");
@@ -405,12 +394,12 @@ public class AliPayService extends BasePayService {
Map<String, Object> parameters = getPublicParameters(AliTransactionType.REFUND);
Map<String, Object> bizContent = getBizContent(tradeNo, outTradeNo, null);
bizContent.put("refund_amount", refundAmount);
bizContent.put("refund_amount", refundAmount.setScale(2, BigDecimal.ROUND_HALF_UP).toString());
//设置请求参数的集合
parameters.put("biz_content", JSON.toJSONString(bizContent));
//设置签名
setSign(parameters);
return callback.perform(requestTemplate.getForObject(httpsReqUrl + "?" + ClientHttpRequest.getMapToParameters(parameters), JSONObject.class));
return callback.perform(requestTemplate.getForObject(getReqUrl() + "?" + ClientHttpRequest.getMapToParameters(parameters), JSONObject.class));
}
@Override
@@ -468,7 +457,7 @@ public class AliPayService extends BasePayService {
parameters.put("biz_content", JSON.toJSONString(bizContent));
//设置签名
setSign(parameters);
return callback.perform(requestTemplate.getForObject(httpsReqUrl + "?" + ClientHttpRequest.getMapToParameters(parameters), JSONObject.class));
return callback.perform(requestTemplate.getForObject(getReqUrl() + "?" + ClientHttpRequest.getMapToParameters(parameters), JSONObject.class));
}
/**
@@ -505,7 +494,7 @@ public class AliPayService extends BasePayService {
parameters.put("biz_content", getContentToJson(tradeNoOrBillDate.toString(), outTradeNoBillType));
//设置签名
setSign(parameters);
return callback.perform(requestTemplate.getForObject(httpsReqUrl + "?" + ClientHttpRequest.getMapToParameters(parameters), JSONObject.class));
return callback.perform(requestTemplate.getForObject(getReqUrl() + "?" + ClientHttpRequest.getMapToParameters(parameters), JSONObject.class));
}

View File

@@ -45,6 +45,9 @@ public abstract class BasePayConfigStorage implements PayConfigStorage{
//授权码锁
private Lock accessTokenLock = new ReentrantLock();
private boolean isTest = false;
@Override
public String getKeyPrivate() {
return keyPrivate;
@@ -160,4 +163,24 @@ public abstract class BasePayConfigStorage implements PayConfigStorage{
return null;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public void setExpiresTime(long expiresTime) {
this.expiresTime = expiresTime;
}
public void setAccessTokenLock(Lock accessTokenLock) {
this.accessTokenLock = accessTokenLock;
}
@Override
public boolean isTest() {
return isTest;
}
public void setTest(boolean test) {
isTest = test;
}
}

View File

@@ -127,4 +127,9 @@ import java.util.concurrent.locks.Lock;
*/
void updateAccessToken(String accessToken, long expiresTime);
/**
* 是否为测试环境, true测试环境
* @return
*/
boolean isTest();
}

View File

@@ -224,8 +224,8 @@ public interface PayService {
/**
* 下载对账单
*
* @param billDate 账单类型商户通过接口或商户经开放平台授权后其所属服务商通过接口可以获取以下账单类型trade、signcustomertrade指商户基于支付宝交易收单的业务账单signcustomer是指基于商户支付宝余额收入及支出等资金变动的帐务账单
* @param billType 账单时间日账单格式为yyyy-MM-dd月账单格式为yyyy-MM。
* @param billDate 账单时间日账单格式为yyyy-MM-dd月账单格式为yyyy-MM。
* @param billType 账单类型商户通过接口或商户经开放平台授权后其所属服务商通过接口可以获取以下账单类型trade、signcustomertrade指商户基于支付宝交易收单的业务账单signcustomer是指基于商户支付宝余额收入及支出等资金变动的帐务账单
* @return
*/
Object downloadbill(Date billDate, String billType);
@@ -242,9 +242,9 @@ public interface PayService {
<T>T downloadbill(Date billDate, String billType, Callback<T> callback);
/**
* 交易辅助接口
* 通用查询接口
*
* @param tradeNoOrBillDate 支付平台订单号或者账单类型 具体请 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link in.egan.pay.common.exception.PayErrorException}
* @param tradeNoOrBillDate 支付平台订单号或者账单日期 具体请 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link in.egan.pay.common.exception.PayErrorException}
*
* @param outTradeNoBillType 商户单号或者 账单类型
* @param transactionType 交易类型

View File

@@ -54,6 +54,7 @@ public abstract class BasePayConfigStorage implements PayConfigStorage{
protected volatile String httpProxyUsername;
protected volatile String httpProxyPassword;
private boolean isTest = false;
/**
* 合作商唯一标识
@@ -226,5 +227,12 @@ public abstract class BasePayConfigStorage implements PayConfigStorage{
public void expireAccessToken() {
this.expiresTime = 0;
}
@Override
public boolean isTest() {
return isTest;
}
public void setTest(boolean test) {
isTest = test;
}
}

View File

@@ -164,4 +164,10 @@ import java.util.concurrent.locks.Lock;
@Deprecated
String getHttpProxyPassword();
/**
* 是否为测试环境, true测试环境
* @return
*/
boolean isTest();
}

View File

@@ -127,7 +127,7 @@ public class PayResponse {
/**
* 初始化支付配置
* @param apyAccount 账户信息
* @see ApyAccount 对应表结构详情--》 pay-java-demo/resources/apy_account.sql
* @see in.egan.pay.demo.entity.ApyAccount 对应表结构详情--》 pay-java-demo/resources/apy_account.sql
*/
public void init(ApyAccount apyAccount) {
@@ -305,6 +305,7 @@ public class ApyAccountService {
* @param bankType 针对刷卡支付,卡的类型,类型值
* @return
*/
@RequestMapping(value = "toPay.html", produces = "text/html;charset=UTF-8")
public String toPay( Integer payId, String transactionType, String bankType, BigDecimal price) {
//获取对应的支付账户操作工具可根据账户id
@@ -358,6 +359,83 @@ public class ApyAccountService {
}
/**
* 查询
* @param order 订单的请求体
* @return
*/
@RequestMapping("query")
public Map<String, Object> query(QueryOrder order) {
PayResponse payResponse = service.getPayResponse(order.getPayId());
return payResponse.getService().query(order.getTradeNo(), order.getOutTradeNo());
}
/**
* 交易关闭接口
* @param order 订单的请求体
* @return
*/
@RequestMapping("close")
public Map<String, Object> close(QueryOrder order) {
PayResponse payResponse = service.getPayResponse(order.getPayId());
return payResponse.getService().close(order.getTradeNo(), order.getOutTradeNo());
}
/**
* 申请退款接口
* @param order 订单的请求体
* @return
*/
@RequestMapping("refund")
public Map<String, Object> refund(QueryOrder order) {
PayResponse payResponse = service.getPayResponse(order.getPayId());
return payResponse.getService().refund(order.getTradeNo(), order.getOutTradeNo(), order.getRefundAmount(), order.getTotalAmount());
}
/**
* 查询退款
* @param order 订单的请求体
* @return
*/
@RequestMapping("refundquery")
public Map<String, Object> refundquery(QueryOrder order) {
PayResponse payResponse = service.getPayResponse(order.getPayId());
return payResponse.getService().refundquery(order.getTradeNo(), order.getOutTradeNo());
}
/**
* 下载对账单
* @param order 订单的请求体
* @return
*/
@RequestMapping("downloadbill")
public Object downloadbill(QueryOrder order) {
PayResponse payResponse = service.getPayResponse(order.getPayId());
return payResponse.getService().downloadbill(order.getBillDate(), order.getBillType());
}
/**
* 通用查询接口,根据 TransactionType 类型进行实现,此接口不包括退款
* @param order 订单的请求体
*
* @return
*/
@RequestMapping("secondaryInterface")
public Map<String, Object> secondaryInterface(QueryOrder order) {
PayResponse payResponse = service.getPayResponse(order.getPayId());
TransactionType type = PayType.valueOf(payResponse.getStorage().getPayType()).getTransactionType(order.getTransactionType());
return payResponse.getService().secondaryInterface(order.getTradeNoOrBillDate(), order.getOutTradeNoBillType(), type, new Callback<Map<String, Object>>() {
@Override
public Map<String, Object> perform(Map<String, Object> map) {
return map;
}
});
}
```

View File

@@ -38,6 +38,11 @@
<artifactId>pay-java-wx-youdian</artifactId>
<version>${pay.version}</version>
</dependency>
<dependency>
<groupId>in.egan</groupId>
<artifactId>pay-java-fuiou</artifactId>
<version>${pay.version}</version>
</dependency>
<!--/支付-->
<dependency>

View File

@@ -8,6 +8,7 @@ import in.egan.pay.common.bean.*;
import in.egan.pay.common.util.str.StringUtils;
import in.egan.pay.demo.entity.ApyAccount;
import in.egan.pay.demo.entity.PayType;
import in.egan.pay.demo.request.QueryOrder;
import in.egan.pay.demo.service.ApyAccountService;
import in.egan.pay.demo.service.PayResponse;
import in.egan.pay.common.api.PayConfigStorage;
@@ -149,27 +150,73 @@ public class PayController{
/**
* 查询
* @param payId
* @param order 订单的请求体
* @return
*/
@RequestMapping("query")
public Map<String, Object> query(Integer payId) {
PayResponse payResponse = service.getPayResponse(payId);
return payResponse.getService().query("4009922001201703072549284850", "8a2950f95a8e17e1015aa7a6eb872ccb");
public Map<String, Object> query(QueryOrder order) {
PayResponse payResponse = service.getPayResponse(order.getPayId());
return payResponse.getService().query(order.getTradeNo(), order.getOutTradeNo());
}
/**
* 交易关闭接口
* @param order 订单的请求体
* @return
*/
@RequestMapping("close")
public Map<String, Object> close(QueryOrder order) {
PayResponse payResponse = service.getPayResponse(order.getPayId());
return payResponse.getService().close(order.getTradeNo(), order.getOutTradeNo());
}
/**
* 通用接口,根据 TransactionType 类型进行实现
* @param payId
* 申请退款接口
* @param order 订单的请求体
* @return
*/
@RequestMapping("refund")
public Map<String, Object> refund(QueryOrder order) {
PayResponse payResponse = service.getPayResponse(order.getPayId());
return payResponse.getService().refund(order.getTradeNo(), order.getOutTradeNo(), order.getRefundAmount(), order.getTotalAmount());
}
/**
* 查询退款
* @param order 订单的请求体
* @return
*/
@RequestMapping("refundquery")
public Map<String, Object> refundquery(QueryOrder order) {
PayResponse payResponse = service.getPayResponse(order.getPayId());
return payResponse.getService().refundquery(order.getTradeNo(), order.getOutTradeNo());
}
/**
* 下载对账单
* @param order 订单的请求体
* @return
*/
@RequestMapping("downloadbill")
public Object downloadbill(QueryOrder order) {
PayResponse payResponse = service.getPayResponse(order.getPayId());
return payResponse.getService().downloadbill(order.getBillDate(), order.getBillType());
}
/**
* 通用查询接口,根据 TransactionType 类型进行实现,此接口不包括退款
* @param order 订单的请求体
*
* @return
*/
@RequestMapping("secondaryInterface")
public Map<String, Object> secondaryInterface(Integer payId, String transactionType) {
PayResponse payResponse = service.getPayResponse(payId);
TransactionType type = PayType.valueOf(payResponse.getStorage().getPayType()).getTransactionType(transactionType);
return payResponse.getService().secondaryInterface("2017012921001004530273937216", "8a2950f959cf08740159ea0666fc04bd", type, new Callback<Map<String, Object>>() {
public Map<String, Object> secondaryInterface(QueryOrder order) {
PayResponse payResponse = service.getPayResponse(order.getPayId());
TransactionType type = PayType.valueOf(payResponse.getStorage().getPayType()).getTransactionType(order.getTransactionType());
return payResponse.getService().secondaryInterface(order.getTradeNoOrBillDate(), order.getOutTradeNoBillType(), type, new Callback<Map<String, Object>>() {
@Override
public Map<String, Object> perform(Map<String, Object> map) {
return map;

View File

@@ -29,15 +29,16 @@ public class ApyAccountRepository {
{
ApyAccount apyAccount1 = new ApyAccount();
apyAccount1.setPayId(1);
apyAccount1.setPartner("2088****78307");
apyAccount1.setAppid("20160****2728");
apyAccount1.setPartner("2088102169916436");
apyAccount1.setAppid("2016080400165436");
// TODO 2017/2/9 16:20 author: egan sign_type只有单一key时public_key与private_key相等比如sign_type=MD5的情况
apyAccount1.setPublicKey("MIGfMA0GCSqGSIb3DQE************LCUYuLkxpLQIDAQAB");
apyAccount1.setPrivateKey("MIICdwIBADANBg************ZBBpE/RtR9Mty8CQFqhVygF3FIiz5Sc38sz12RqOT7kUQK3R0FiATOtXkKHLzb/QyolOXi/avhLp/gIl7+IqZg51Vx8BvyypnIfKgw=");
apyAccount1.setPublicKey("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDIgHnOn7LLILlKETd6BFRJ0GqgS2Y3mn1wMQmyh9zEyWlz5p1zrahRahbXAfCfSqshSNfqOmAQzSHRVjCqjsAw1jyqrXaPdKBmr90DIpIxmIyKXv4GGAkPyJ/6FTFY99uhpiq0qadD/uSzQsefWo0aTvP/65zi3eof7TcZ32oWpwIDAQAB");
apyAccount1.setPrivateKey("MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKroe/8h5vC4L6T+B2WdXiVwGsMvUKgb2XsKix6VY3m2wcf6tyzpNRDCNykbIwGtaeo7FshN+qZxdXHLiIam9goYncBit/8ojfLGy2gLxO/PXfzGxYGs0KsDZ+ryVPPmE34ZZ8jiJpR0ygzCFl8pN3QJPJRGTJn5+FTT9EF/9zyZAgMBAAECgYAktngcYC35u7cQXDk+jMVyiVhWYU2ULxdSpPspgLGzrZyG1saOcTIi/XVX8Spd6+B6nmLQeF/FbU3rOeuD8U2clzul2Z2YMbJ0FYay9oVZFfp5gTEFpFRTVfzqUaZQBIjJe/xHL9kQVqc5xHlE/LVA27/Kx3dbC35Y7B4EVBDYAQJBAOhsX8ZreWLKPhXiXHTyLmNKhOHJc+0tFH7Ktise/0rNspojU7o9prOatKpNylp9v6kux7migcMRdVUWWiVe+4ECQQC8PqsuEz7B0yqirQchRg1DbHjh64bw9Kj82EN1/NzOUd53tP9tg+SO97EzsibK1F7tOcuwqsa7n2aY48mQ+y0ZAkBndA2xcRcnvOOjtAz5VO8G7R12rse181HjGfG6AeMadbKg30aeaGCyIxN1loiSfNR5xsPJwibGIBg81mUrqzqBAkB+K6rkaPXJR9XtzvdWb/N3235yPkDlw7Z4MiOVM3RzvR/VMDV7m8lXoeDde2zQyeMOMYy6ztwA6WgE1bhGOnQRAkEAouUBv1sVdSBlsexX15qphOmAevzYrpufKgJIRLFWQxroXMS7FTesj+f+FmGrpPCxIde1dqJ8lqYLTyJmbzMPYw==\n");
apyAccount1.setNotifyUrl("http://pay.egan.in/payBack2.json");
// 无需同步回调可不填
apyAccount1.setReturnUrl("");
// apyAccount1.setReturnUrl("");
apyAccount1.setInputCharset("UTF-8");
apyAccount1.setSeller("2088102169916436");
apyAccount1.setSignType(SignUtils.RSA.name());
apyAccount1.setPayType(PayType.aliPay);
apyAccount1.setMsgType(MsgType.text);

View File

@@ -54,7 +54,8 @@ public class ApyAccount {
// @Enumerated(EnumType.STRING)
// @Column(name = "msg_type")
private MsgType msgType;
//是否为测试环境
private boolean isTest = false;
public Integer getPayId() {
return payId;
}
@@ -151,6 +152,14 @@ public class ApyAccount {
this.inputCharset = inputCharset;
}
public boolean isTest() {
return isTest;
}
public void setTest(boolean test) {
isTest = test;
}
@Override
public String toString() {
return "ApyAccount{" +

View File

@@ -43,6 +43,7 @@ public enum PayType implements BasePayType {
aliPayConfigStorage.setPayType(apyAccount.getPayType().toString());
aliPayConfigStorage.setMsgType(apyAccount.getMsgType());
aliPayConfigStorage.setInputCharset(apyAccount.getInputCharset());
aliPayConfigStorage.setTest(apyAccount.isTest());
return new AliPayService(aliPayConfigStorage);
}
@@ -67,6 +68,7 @@ public enum PayType implements BasePayType {
wxPayConfigStorage.setPayType(apyAccount.getPayType().toString());
wxPayConfigStorage.setMsgType(apyAccount.getMsgType());
wxPayConfigStorage.setInputCharset(apyAccount.getInputCharset());
wxPayConfigStorage.setTest(apyAccount.isTest());
return new WxPayService(wxPayConfigStorage);
}
@@ -95,6 +97,7 @@ public enum PayType implements BasePayType {
wxPayConfigStorage.setMsgType(apyAccount.getMsgType());
wxPayConfigStorage.setSeller(apyAccount.getSeller());
wxPayConfigStorage.setInputCharset(apyAccount.getInputCharset());
wxPayConfigStorage.setTest(apyAccount.isTest());
return new WxYouDianPayService(wxPayConfigStorage);
}

View File

@@ -0,0 +1,116 @@
package in.egan.pay.demo.request;
import in.egan.pay.common.bean.TransactionType;
import java.math.BigDecimal;
import java.util.Date;
/**
* 订单辅助接口
* @author: egan
* @email egzosn@gmail.com
* @date 2017/3/12 14:50
*/
public class QueryOrder {
private Integer payId;
// 支付平台订单号
private String tradeNo;
// 商户单号
private String outTradeNo;
// 退款金额
private BigDecimal refundAmount;
// 总金额
private BigDecimal totalAmount;
// 账单时间:具体请查看对应支付平台
private Date billDate;
// 账单时间:具体请查看对应支付平台
private String billType;
// 支付平台订单号或者账单日期
private Object tradeNoOrBillDate;
// 商户单号或者 账单类型
private String outTradeNoBillType;
// 交易类型
private String transactionType;
public Integer getPayId() {
return payId;
}
public void setPayId(Integer payId) {
this.payId = payId;
}
public String getTradeNo() {
return tradeNo;
}
public void setTradeNo(String tradeNo) {
this.tradeNo = tradeNo;
}
public String getOutTradeNo() {
return outTradeNo;
}
public void setOutTradeNo(String outTradeNo) {
this.outTradeNo = outTradeNo;
}
public BigDecimal getRefundAmount() {
return refundAmount;
}
public void setRefundAmount(BigDecimal refundAmount) {
this.refundAmount = refundAmount;
}
public BigDecimal getTotalAmount() {
return totalAmount;
}
public void setTotalAmount(BigDecimal totalAmount) {
this.totalAmount = totalAmount;
}
public Date getBillDate() {
return billDate;
}
public void setBillDate(Date billDate) {
this.billDate = billDate;
}
public String getBillType() {
return billType;
}
public void setBillType(String billType) {
this.billType = billType;
}
public Object getTradeNoOrBillDate() {
return tradeNoOrBillDate;
}
public void setTradeNoOrBillDate(Object tradeNoOrBillDate) {
this.tradeNoOrBillDate = tradeNoOrBillDate;
}
public String getOutTradeNoBillType() {
return outTradeNoBillType;
}
public void setOutTradeNoBillType(String outTradeNoBillType) {
this.outTradeNoBillType = outTradeNoBillType;
}
public String getTransactionType() {
return transactionType;
}
public void setTransactionType(String transactionType) {
this.transactionType = transactionType;
}
}

View File

@@ -7,6 +7,7 @@
<body>
账户信息添加用于下面测试
<div>
<form id="form">
@@ -31,7 +32,7 @@
<option>RSA</option>
</select>
<br>
编码类型(建议UTF-8)<input type="text" name="inputCharset">
编码类型(建议UTF-8)<input type="text" name="inputCharset" value="UTF-8">
<br>
支付账户类型 <select name="payType">
<option value="aliPay">aliPay</option>
@@ -44,6 +45,11 @@
<option>xml</option>
<option>json</option>
</select>
<br>
是否为沙箱环境<select type="text" name="isTest">
<option value="true"></option>
<option value="false"></option>
</select>
<br>
</form>
<button id="submit">提交</button>
@@ -51,7 +57,8 @@
<br/>
<div>各个支付对应的<b>交易类型</b>可自行查看对应的官方文档,本项目已实现几种交易类型,对应各个支付类型的<code>in.egan.pay.common.bean.TransactionType</code>具体实现</div>
<div>支付宝(<code>in.egan.pay.ali.bean.AliTransactionType</code>) 即时付款=DIRECT 移动支付=APP 手机网站支付=WAP</div>
<div>旧版支付宝(<code>in.egan.pay.ali.before.bean.AliTransactionType</code>) 即时付款=DIRECT 移动支付=APP 手机网站支付=WAP</div>
<div>新版支付宝(<code>in.egan.pay.ali.bean.AliTransactionType</code>) app支付=APP 手机网站支付=WAP , 扫码付=SWEEPPAY, 条码付=BAR_CODE, 声波付=WAVE_CODE </div>
<div>微信(<code>in.egan.pay.wx.bean.WxTransactionType</code>) 公众号支付=JSAPI 移动支付=APP 扫码付=NATIVE</div>
<div>友店微信(<code>in.egan.pay.wx.youdian.bean.YoudianTransactionType</code>) 扫码付=NATIVE</div>
@@ -92,6 +99,80 @@ APP提交(返回对应的json具体实现app端demo暂时未实现)
<br>
<input type="submit" value="提交">
</form>
<br>
查询账单
<form action="query" target="_blank">
账户id<input type="text" name="payId">
<br>
支付平台订单号<input type="text" name="tradeNo">
<br>
商户单号<input type="text" name="outTradeNo">
<br>
<input type="submit" value="提交">
</form>
<br/>
交易关闭接口
<form action="close" target="_blank">
账户id<input type="text" name="payId">
<br>
支付平台订单号<input type="text" name="tradeNo">
<br>
商户单号<input type="text" name="outTradeNo">
<br>
<input type="submit" value="提交">
</form>
<br/>
申请退款接口
<form action="refund" target="_blank">
账户id<input type="text" name="payId">
<br>
支付平台订单号<input type="text" name="tradeNo">
<br>
商户单号<input type="text" name="outTradeNo">
<br>
退款金额<input type="text" name="refundAmount">
<br>
总金额(微信必填)<input type="text" name="totalAmount">
<br>
<input type="submit" value="提交">
</form>
<br/>
查询退款
<form action="refundquery" target="_blank">
账户id<input type="text" name="payId">
<br>
支付平台订单号<input type="text" name="tradeNo">
<br>
商户单号<input type="text" name="outTradeNo">
<br>
<input type="submit" value="提交">
</form>
<br>
下载对账单(日期,不支持月份)
<form action="downloadbill" target="_blank">
账户id<input type="text" name="payId">
<br>
账单时间:具体请查看对应支付平台<input type="text" name="billDate">
<br>
账单类型 <input type="text" name="billType">
<br>
<input type="submit" value="提交">
</form>
<br>
通用查询接口,根据 交易类型TransactionType 进行实现,此接口不包括退款
<form action="secondaryInterface" target="_blank">
账户id<input type="text" name="payId">
<br>
支付平台订单号或者账单日期<input type="text" name="tradeNoOrBillDate">
<br>
商户单号或者 账单类型<input type="text" name="outTradeNoBillType">
<br>
交易类型<input type="text" name="transactionType">
<br>
<input type="submit" value="提交">
</form>
<script src="jquery-3.1.1.min.js"></script>
<script>
$(function ($) {

View File

@@ -342,8 +342,8 @@ public class WxPayService extends BasePayService {
parameters.put("out_trade_no", outTradeNo);
parameters.put("out_refund_no", outTradeNo);
}
parameters.put("total_fee", totalAmount);
parameters.put("refund_fee", refundAmount);
parameters.put("total_fee", totalAmount.multiply(new BigDecimal(100)).intValue());
parameters.put("refund_fee", refundAmount.multiply(new BigDecimal(100)).intValue());
parameters.put("op_user_id", payConfigStorage.getPid());
//设置签名