Merge remote-tracking branch 'origin/develop'

This commit is contained in:
egzosn
2017-03-11 10:27:18 +08:00
8 changed files with 160 additions and 73 deletions

View File

@@ -3,7 +3,7 @@
##整合支付模块(微信支付,支付宝)
声明: 本项目最初想法自 https://github.com/chanjarster/weixin-java-tools, 15年1月左右关注chanjarster/weixin-java-tools并将其htpp请求基础与回调处理修改并进行使用。
声明: 本项目最初想法自 https://github.com/chanjarster/weixin-java-tools, 15年1月左右关注chanjarster/weixin-java-tools并将其回调处理修改并进行使用。
开发版 https://git.oschina.net/egzosn/pay-java-parent/tree/develop

View File

@@ -36,7 +36,8 @@ 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.alipay.com/gateway.do";
private String httpsReqUrl = "https://openapi.alipaydev.com/gateway.do";
private String httpsReqUrlBefore = "https://mapi.alipay.com/gateway.do";
public AliPayService(PayConfigStorage payConfigStorage, HttpConfigStorage configStorage) {
@@ -90,7 +91,7 @@ public class AliPayService extends BasePayService {
@Override
public boolean verifySource(String id) {
return "true".equals(requestTemplate.getForObject( getHttpsVerifyUrl() + "partner=" + payConfigStorage.getPid() + "&notify_id=" + id, String.class));
return "true".equals(requestTemplate.getForObject( getHttpsVerifyUrl() + "pid=" + payConfigStorage.getPid() + "&notify_id=" + id, String.class));
}
@@ -101,7 +102,7 @@ public class AliPayService extends BasePayService {
*/
private Map<String, Object> setSign(Map<String, Object> parameters){
parameters.put("sign_type", payConfigStorage.getSignType());
String sign = createSign( SignUtils.parameterText(parameters, "&", "sign", "appId"), payConfigStorage.getInputCharset());
String sign = createSign( SignUtils.parameterText(parameters, "&", "sign"), payConfigStorage.getInputCharset());
/* try {
sign = URLEncoder.encode(sign, payConfigStorage.getInputCharset());
@@ -163,9 +164,14 @@ public class AliPayService extends BasePayService {
Map<String, Object> orderInfo = getPublicParameters(order.getTransactionType());
orderInfo.put("notify_url", payConfigStorage.getNotifyUrl());
orderInfo.put("format", "json");
Map<String, Object> bizContent = new TreeMap<>();
if ("alipay.trade.pay".equals(order.getTransactionType().getMethod())){
if (order.getTransactionType() == AliTransactionType.WAP){
bizContent.put("product_code", "QUICK_WAP_PAY");
orderInfo.put("return_url", payConfigStorage.getReturnUrl());
}else if ("alipay.trade.pay".equals(order.getTransactionType().getMethod())){
bizContent.put("scene", order.getTransactionType().toString().toLowerCase());
bizContent.put("product_code", "FACE_TO_FACE_PAYMENT");
bizContent.put("auth_code", order.getAuthCode());
@@ -173,7 +179,7 @@ public class AliPayService extends BasePayService {
bizContent.put("product_code", "QUICK_MSECURITY_PAY");
}
bizContent.put("body", order.getBody());
bizContent.put("seller_id", payConfigStorage.getPid());
bizContent.put("seller_id", payConfigStorage.getSeller());
bizContent.put("subject", order.getSubject());
bizContent.put("out_trade_no", order.getOutTradeNo());
bizContent.put("total_amount", order.getPrice().setScale(2, BigDecimal.ROUND_HALF_UP).toString());
@@ -191,8 +197,10 @@ public class AliPayService extends BasePayService {
orderInfo.put("app_id", payConfigStorage.getAppid());
orderInfo.put("method", transactionType.getMethod());
orderInfo.put("charset", payConfigStorage.getInputCharset());
DateFormat formatter = DateFormat.getDateTimeInstance();
orderInfo.put("timestamp", formatter.format( new Date()));
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
df.setTimeZone(TimeZone.getTimeZone("GMT+8"));
// DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
orderInfo.put("timestamp", df.format(new Date()));
orderInfo.put("version", "1.0");
return orderInfo;
}
@@ -285,23 +293,34 @@ public class AliPayService extends BasePayService {
public String buildRequest(Map<String, Object> orderInfo, MethodType method) {
StringBuffer formHtml = new StringBuffer();
formHtml.append("<form id=\"_alipaysubmit_\" name=\"alipaysubmit\" action=\"");
if (null == orderInfo.get("method")) {
formHtml.append(httpsReqUrlBefore)
.append("?_input_charset=")
.append(payConfigStorage.getInputCharset())
.append("\" method=\"")
.append(method.name().toLowerCase()).append("\">");
for (String key : orderInfo.keySet()) {
Object o = orderInfo.get(key);
if (null == o || "null".equals(o) || "".equals(o)) {
continue;
}
formHtml.append("<form id=\"_alipaysubmit_\" name=\"alipaysubmit\" action=\"" )
.append( null == orderInfo.get("method") ? httpsReqUrlBefore : httpsReqUrl)
.append( "?_input_charset=" )
.append( payConfigStorage.getInputCharset())
.append( "\" method=\"")
.append( method.name().toLowerCase()) .append( "\">");
formHtml.append("<input type=\"hidden\" name=\"" + key + "\" value=\"" + orderInfo.get(key) + "\"/>");
for (String key: orderInfo.keySet()) {
Object o = orderInfo.get(key);
if (null == o ||"null".equals(o) || "".equals(o) ){
continue;
}
formHtml.append("<input type=\"hidden\" name=\"" + key + "\" value=\"" + orderInfo.get(key) + "\"/>");
} else {
String biz_content = (String)orderInfo.remove("biz_content");
formHtml.append(httpsReqUrl).append("?").append(ClientHttpRequest.getMapToParameters(orderInfo))
.append("\" method=\"")
.append(method.name().toLowerCase()).append("\">");
formHtml.append("<input type=\"hidden\" name=\"biz_content\" value=\"" + biz_content.replace("\"", "&quot;") + "\"/>");
}
//submit按钮控件请不要含有name属性
// formHtml.append("<input type=\"submit\" value=\"\" style=\"display:none;\">");
formHtml.append("</form>");
@@ -369,9 +388,9 @@ public class AliPayService extends BasePayService {
}
@Override
public Map<String, Object> refund(String tradeNo, String outTradeNo) {
public Map<String, Object> refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount) {
return refund(tradeNo, outTradeNo, new Callback<Map<String, Object>>() {
return refund(tradeNo, outTradeNo, refundAmount, totalAmount, new Callback<Map<String, Object>>() {
@Override
public Map<String, Object> perform(Map<String, Object> map) {
return map;
@@ -380,8 +399,17 @@ public class AliPayService extends BasePayService {
}
@Override
public <T> T refund(String tradeNo, String outTradeNo, Callback<T> callback) {
return secondaryInterface(tradeNo, outTradeNo, AliTransactionType.REFUND, callback);
public <T> T refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount, Callback<T> callback) {
//获取公共参数
Map<String, Object> parameters = getPublicParameters(AliTransactionType.REFUND);
Map<String, Object> bizContent = getBizContent(tradeNo, outTradeNo, null);
bizContent.put("refund_amount", refundAmount);
//设置请求参数的集合
parameters.put("biz_content", JSON.toJSONString(bizContent));
//设置签名
setSign(parameters);
return callback.perform(requestTemplate.getForObject(httpsReqUrl + "?" + ClientHttpRequest.getMapToParameters(parameters), JSONObject.class));
}
@Override
@@ -454,6 +482,11 @@ public class AliPayService extends BasePayService {
*/
@Override
public <T> T secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType, Callback<T> callback) {
if (transactionType == AliTransactionType.REFUND){
throw new PayErrorException(new PayException("failure", "通用接口不支持:" + transactionType));
}
if (transactionType == AliTransactionType.DOWNLOADBILL){
if (tradeNoOrBillDate instanceof Date){
return downloadbill((Date) tradeNoOrBillDate, outTradeNoBillType, callback);
@@ -476,20 +509,34 @@ public class AliPayService extends BasePayService {
}
/**
* 获取biz_content。不包含下载账单
* 获取biz_content。请求参数的集合 不包含下载账单
* @param tradeNo 支付平台订单号
* @param outTradeNo 商户单号
* @param bizContent 请求参数的集合
* @return
*/
private String getContentToJson(String tradeNo, String outTradeNo){
Map<String, Object> bizContent = new TreeMap<>();
private Map<String, Object> getBizContent(String tradeNo, String outTradeNo, Map<String, Object> bizContent){
if (null == bizContent){
bizContent = new TreeMap<>();
}
if (null != outTradeNo){
bizContent.put("out_trade_no", outTradeNo);
}
if (null != tradeNo){
bizContent.put("trade_no", tradeNo);
}
return JSON.toJSONString(bizContent);
return bizContent;
}
/**
* 获取biz_content。不包含下载账单
* @param tradeNo 支付平台订单号
* @param outTradeNo 商户单号
* @return
*/
private String getContentToJson(String tradeNo, String outTradeNo){
return JSON.toJSONString(getBizContent(tradeNo, outTradeNo, null));
}
}

View File

@@ -41,11 +41,7 @@
<artifactId>core</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>com.alipay</groupId>
<artifactId>app</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</project>

View File

@@ -9,6 +9,7 @@ import in.egan.pay.common.http.HttpRequestTemplate;
import java.awt.image.BufferedImage;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Map;
@@ -179,23 +180,27 @@ public interface PayService {
<T>T close(String tradeNo, String outTradeNo, Callback<T> callback);
/**
* 交易关闭接口
* 申请退款接口
*
* @param tradeNo 支付平台订单号
* @param outTradeNo 商户单号
* @param refundAmount 退款金额
* @param totalAmount 总金额
* @return
*/
Map<String, Object> refund(String tradeNo, String outTradeNo);
Map<String, Object> refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount);
/**
* 交易关闭接口
* 申请退款接口
*
* @param tradeNo 支付平台订单号
* @param outTradeNo 商户单号
* @param refundAmount 退款金额
* @param totalAmount 总金额
* @param callback 处理器
* @param <T> 返回类型
* @return
*/
<T>T refund(String tradeNo, String outTradeNo, Callback<T> callback);
<T>T refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount, Callback<T> callback);
/**
* 查询退款

View File

@@ -2,7 +2,7 @@
package in.egan.pay.demo.controller;
import in.egan.pay.ali.before.bean.AliTransactionType;
import in.egan.pay.common.api.Callback;
import in.egan.pay.common.bean.*;
import in.egan.pay.common.util.str.StringUtils;

View File

@@ -1,8 +1,8 @@
package in.egan.pay.demo.entity;
import in.egan.pay.ali.api.AliPayConfigStorage;
import in.egan.pay.ali.before.api.AliPayService;
import in.egan.pay.ali.before.bean.AliTransactionType;
import in.egan.pay.ali.api.AliPayService;
import in.egan.pay.ali.bean.AliTransactionType;
import in.egan.pay.common.api.PayService;
import in.egan.pay.common.bean.BasePayType;
import in.egan.pay.common.bean.TransactionType;

View File

@@ -387,12 +387,12 @@ public class WxYouDianPayService extends BasePayService {
}
@Override
public Map<String, Object> refund(String tradeNo, String outTradeNo) {
public Map<String, Object> refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount) {
return null;
}
@Override
public <T> T refund(String tradeNo, String outTradeNo, Callback<T> callback) {
public <T> T refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount, Callback<T> callback) {
return null;
}

View File

@@ -41,9 +41,8 @@ public class WxPayService extends BasePayService {
public final static String httpsVerifyUrl = "https://gw.tenpay.com/gateway";
public final static String uri = "https://api.mch.weixin.qq.com/";
public final static String unifiedOrderUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder";
// public final static String unifiedOrderUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder";
// public final static String orderqueryUrl = "https://api.mch.weixin.qq.com/pay/orderquery";
@@ -255,14 +254,14 @@ public class WxPayService extends BasePayService {
/**
* 交易查询接口
* @param tradeNo 支付平台订单号
* @param transactionId 支付平台订单号
* @param outTradeNo 商户单号
* @return
*/
@Override
public Map<String, Object> query(String tradeNo, String outTradeNo) {
public Map<String, Object> query(String transactionId, String outTradeNo) {
return query(tradeNo, outTradeNo, new Callback<Map<String, Object>>() {
return query(transactionId, outTradeNo, new Callback<Map<String, Object>>() {
@Override
public Map<String, Object> perform(Map<String, Object> map) {
return map;
@@ -272,23 +271,23 @@ public class WxPayService extends BasePayService {
/**
*
* @param tradeNo 支付平台订单号
* @param transactionId 支付平台订单号
* @param outTradeNo 商户单号
* @param callback 处理器
* @param <T>
* @return
*/
@Override
public <T> T query(String tradeNo, String outTradeNo, Callback<T> callback) {
public <T> T query(String transactionId, String outTradeNo, Callback<T> callback) {
return secondaryInterface(tradeNo, outTradeNo, WxTransactionType.QUERY, callback);
return secondaryInterface(transactionId, outTradeNo, WxTransactionType.QUERY, callback);
}
@Override
public Map<String, Object> close(String tradeNo, String outTradeNo) {
public Map<String, Object> close(String transactionId, String outTradeNo) {
return close(tradeNo, outTradeNo, new Callback<Map<String, Object>>() {
return close(transactionId, outTradeNo, new Callback<Map<String, Object>>() {
@Override
public Map<String, Object> perform(Map<String, Object> map) {
return map;
@@ -297,14 +296,64 @@ public class WxPayService extends BasePayService {
}
@Override
public <T> T close(String tradeNo, String outTradeNo, Callback<T> callback) {
return secondaryInterface(tradeNo, outTradeNo, WxTransactionType.CLOSE, callback);
public <T> T close(String transactionId, String outTradeNo, Callback<T> callback) {
return secondaryInterface(transactionId, outTradeNo, WxTransactionType.CLOSE, callback);
}
/**
* 退款
* @param transactionId 微信订单号
* @param outTradeNo 商户单号
* @param refundAmount 退款金额
* @param totalAmount 总金额
* @return
*/
@Override
public Map<String, Object> refund(String transactionId, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount) {
return refund(transactionId, outTradeNo, refundAmount, totalAmount, new Callback<Map<String, Object>>() {
@Override
public Map<String, Object> perform(Map<String, Object> map) {
return map;
}
});
}
/**
* 退款
*
* @param transactionId 微信订单号
* @param outTradeNo 商户单号
* @param refundAmount 退款金额
* @param totalAmount 总金额
* @param callback 处理器
* @param <T>
* @return
*/
@Override
public <T> T refund(String transactionId, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount, Callback<T> callback) {
//获取公共参数
Map<String, Object> parameters = getPublicParameters();
if (null != transactionId) {
parameters.put("transaction_id", transactionId);
parameters.put("out_refund_no", transactionId);
} else {
parameters.put("out_trade_no", outTradeNo);
parameters.put("out_refund_no", outTradeNo);
}
parameters.put("total_fee", totalAmount);
parameters.put("refund_fee", refundAmount);
parameters.put("op_user_id", payConfigStorage.getPid());
//设置签名
setSign(parameters);
return callback.perform(requestTemplate.postForObject(getUrl(WxTransactionType.REFUND), XML.getMap2Xml(parameters), JSONObject.class));
}
@Override
public Map<String, Object> refund(String tradeNo, String outTradeNo) {
return refund(tradeNo, outTradeNo, new Callback<Map<String, Object>>() {
public Map<String, Object> refundquery(String transactionId, String outTradeNo) {
return refundquery(transactionId, outTradeNo, new Callback<Map<String, Object>>() {
@Override
public Map<String, Object> perform(Map<String, Object> map) {
return map;
@@ -313,23 +362,8 @@ public class WxPayService extends BasePayService {
}
@Override
public <T> T refund(String tradeNo, String outTradeNo, Callback<T> callback) {
return secondaryInterface(tradeNo, outTradeNo, WxTransactionType.REFUND, callback);
}
@Override
public Map<String, Object> refundquery(String tradeNo, String outTradeNo) {
return refundquery(tradeNo, outTradeNo, new Callback<Map<String, Object>>() {
@Override
public Map<String, Object> perform(Map<String, Object> map) {
return map;
}
});
}
@Override
public <T> T refundquery(String tradeNo, String outTradeNo, Callback<T> callback) {
return secondaryInterface(tradeNo, outTradeNo, WxTransactionType.REFUNDQUERY, callback);
public <T> T refundquery(String transactionId, String outTradeNo, Callback<T> callback) {
return secondaryInterface(transactionId, outTradeNo, WxTransactionType.REFUNDQUERY, callback);
}
/**
@@ -386,6 +420,11 @@ public class WxPayService extends BasePayService {
@Override
public <T> T secondaryInterface(Object transactionIdOrBillDate, String outTradeNoBillType, TransactionType transactionType, Callback<T> callback) {
if (transactionType == WxTransactionType.REFUND){
throw new PayErrorException(new PayException("failure", "通用接口不支持:" + transactionType));
}
if (transactionType == WxTransactionType.DOWNLOADBILL){
if (transactionIdOrBillDate instanceof Date){
return downloadbill((Date) transactionIdOrBillDate, outTradeNoBillType, callback);