mirror of
https://gitee.com/egzosn/pay-java-parent.git
synced 2026-06-04 15:39:37 +08:00
Merge remote-tracking branch 'origin/develop' into develop
This commit is contained in:
20
README.md
20
README.md
@@ -1,15 +1,13 @@
|
||||
|
||||
#pay-java-parent
|
||||
|
||||
##整合支付模块(微信支付,支付宝)
|
||||
## 整合支付模块
|
||||
|
||||
声明: 本项目最初想法自 https://github.com/chanjarster/weixin-java-tools, 15年1月左右关注chanjarster/weixin-java-tools,并将其回调处理修改并进行使用。
|
||||
|
||||
开发版 https://git.oschina.net/egzosn/pay-java-parent/tree/develop
|
||||
|
||||
###特性
|
||||
|
||||
|
||||
### 特性
|
||||
|
||||
1. 不依赖任何 mvc 框架
|
||||
2. 也不依赖 servlet,仅仅作为工具使用,可轻松嵌入到任何系统里(项目例子利用spring mvc的 @PathVariable进行,推荐使用类似的框架)
|
||||
@@ -17,14 +15,14 @@
|
||||
4. 控制层统一异常处理
|
||||
5. LogBack日志记录
|
||||
6. 简单快速完成支付模块的开发
|
||||
7. 支持多种支付类型多支付账户扩展(目前已支持微信支付,支付宝支付,友店支付)
|
||||
7. 支持多种支付类型多支付账户扩展
|
||||
|
||||
###本项目包含 3 个部分:
|
||||
### 本项目包含 3 个部分:
|
||||
|
||||
1. pay-java-common 公共lib,支付核心与规范定义
|
||||
2. pay-java-demo 具体的支付demo
|
||||
3. pay-java-* 具体的支付实现库
|
||||
###Maven配置
|
||||
### Maven配置
|
||||
支付核心模块
|
||||
```xml
|
||||
|
||||
@@ -50,12 +48,12 @@
|
||||
|
||||
|
||||
|
||||
###使用
|
||||
### 使用
|
||||
这里不多说直接上代码 集群的话,友店可能会有bug。
|
||||
|
||||
测试链接 : http://pay.egzosn.com/index.html
|
||||
|
||||
######单一支付教程
|
||||
###### 单一支付教程
|
||||
|
||||
[支付宝](pay-java-ali?dir=1&filepath=pay-java-ali)
|
||||
[微信](pay-java-wx?dir=1&filepath=pay-java-wx)
|
||||
@@ -67,11 +65,13 @@
|
||||
android 例子 [pay-java-android](http://git.oschina.net/egzosn/pay-java-android)
|
||||
|
||||
|
||||
##交流
|
||||
## 交流
|
||||
很希望更多志同道合友友一起扩展新的的支付接口。
|
||||
|
||||
这里感谢[ouyangxiangshao](https://github.com/ouyangxiangshao),[ZhuangXiong](https://github.com/ZhuangXiong) 与[Actinian](http://git.oschina.net/Actinia517) 所提交的安卓例子或者分支
|
||||
|
||||
也感谢各大友友同学帮忙进行接口测试
|
||||
|
||||
非常欢迎和感谢对本项目发起Pull Request的同学,不过本项目基于git flow开发流程,因此在发起Pull Request的时候请选择develop分支。
|
||||
|
||||
E-Mail:egzosn@gmail.com
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
|
||||
|
||||
##支付宝支付简单例子
|
||||
## 支付宝支付简单例子
|
||||
|
||||
####支付配置
|
||||
#### 支付配置
|
||||
|
||||
```java
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
```
|
||||
|
||||
|
||||
####创建支付服务
|
||||
#### 创建支付服务
|
||||
|
||||
|
||||
```java
|
||||
@@ -61,7 +61,7 @@
|
||||
|
||||
```
|
||||
|
||||
####创建支付订单信息
|
||||
#### 创建支付订单信息
|
||||
|
||||
```java
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
|
||||
```
|
||||
|
||||
####扫码付
|
||||
#### 扫码付
|
||||
|
||||
```java
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
|
||||
```
|
||||
|
||||
####APP支付
|
||||
#### APP支付
|
||||
|
||||
```java
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
|
||||
```
|
||||
|
||||
####即时到帐 WAP 网页支付
|
||||
#### 即时到帐 WAP 网页支付
|
||||
|
||||
```java
|
||||
|
||||
@@ -111,7 +111,7 @@
|
||||
|
||||
```
|
||||
|
||||
####条码付 声波付
|
||||
#### 条码付 声波付
|
||||
|
||||
```java
|
||||
|
||||
@@ -127,7 +127,7 @@
|
||||
|
||||
```
|
||||
|
||||
####回调处理
|
||||
#### 回调处理
|
||||
|
||||
```java
|
||||
|
||||
@@ -146,7 +146,7 @@
|
||||
```
|
||||
|
||||
|
||||
####支付订单查询
|
||||
#### 支付订单查询
|
||||
|
||||
```java
|
||||
|
||||
@@ -155,7 +155,7 @@
|
||||
```
|
||||
|
||||
|
||||
####交易关闭接口
|
||||
#### 交易关闭接口
|
||||
```java
|
||||
|
||||
Map result = service..query("支付宝单号", "我方系统单号");
|
||||
@@ -163,7 +163,7 @@
|
||||
```
|
||||
|
||||
|
||||
####申请退款接口
|
||||
#### 申请退款接口
|
||||
```java
|
||||
|
||||
Map result = service.refund("支付宝单号", "我方系统单号", "退款金额", "订单总金额");
|
||||
@@ -171,14 +171,14 @@
|
||||
```
|
||||
|
||||
|
||||
####查询退款
|
||||
#### 查询退款
|
||||
```java
|
||||
|
||||
Map result = service.refundquery("支付宝单号", "我方系统单号");
|
||||
|
||||
```
|
||||
|
||||
####下载对账单
|
||||
#### 下载对账单
|
||||
```java
|
||||
|
||||
Map result = service.downloadbill("账单时间:日账单格式为yyyy-MM-dd,月账单格式为yyyy-MM", "账单类型");
|
||||
|
||||
@@ -4,23 +4,29 @@ import com.egzosn.pay.common.api.BasePayConfigStorage;
|
||||
|
||||
/**
|
||||
* 支付配置存储
|
||||
* author egan
|
||||
* @author egan
|
||||
*
|
||||
* email egzosn@gmail.com
|
||||
* date 2016-5-18 14:09:01
|
||||
*/
|
||||
public class AliPayConfigStorage extends BasePayConfigStorage {
|
||||
|
||||
// 商户PID
|
||||
/**
|
||||
* 商户PID
|
||||
*/
|
||||
public volatile String appId ;
|
||||
// 商户签约拿到的pid,partner_id的简称,合作伙伴身份等同于 partner
|
||||
/**
|
||||
* 商户签约拿到的pid,partner_id的简称,合作伙伴身份等同于 partner
|
||||
*/
|
||||
public volatile String pid ;
|
||||
//partner_id的简称,合作伙伴身份
|
||||
// public volatile String partner ;
|
||||
|
||||
// 商户收款账号
|
||||
/**
|
||||
* 商户收款账号
|
||||
*/
|
||||
public volatile String seller;
|
||||
//公钥
|
||||
/**
|
||||
* 公钥
|
||||
*/
|
||||
private volatile String aliPublicKey;
|
||||
|
||||
|
||||
@@ -44,26 +50,6 @@ public class AliPayConfigStorage extends BasePayConfigStorage {
|
||||
return appId;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see #getPid()
|
||||
* @return 合作者id
|
||||
*/
|
||||
@Deprecated
|
||||
@Override
|
||||
public String getPartner() {
|
||||
return pid;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 设置合作者id
|
||||
* @see #setPid(String)
|
||||
* @param partner 合作者id
|
||||
*/
|
||||
@Deprecated
|
||||
public void setPartner(String partner) {
|
||||
this.pid = partner;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPid() {
|
||||
@@ -74,6 +60,7 @@ public class AliPayConfigStorage extends BasePayConfigStorage {
|
||||
this.pid = pid;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getSeller() {
|
||||
return seller;
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.InputStream;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.math.BigDecimal;
|
||||
import java.text.DateFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
@@ -243,6 +244,17 @@ public class AliPayService extends BasePayService {
|
||||
for (int i = 0,len = values.length; i < len; i++) {
|
||||
valueStr += (i == len - 1) ? values[i] : values[i] + ",";
|
||||
}
|
||||
//乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
|
||||
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
|
||||
if (!valueStr.matches("\\w+")){
|
||||
try {
|
||||
if(valueStr.equals(new String(valueStr.getBytes("iso8859-1"), "iso8859-1"))){
|
||||
valueStr=new String(valueStr.getBytes("iso8859-1"), payConfigStorage.getInputCharset());
|
||||
}
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
params.put(name, valueStr);
|
||||
}
|
||||
|
||||
|
||||
@@ -33,11 +33,11 @@ import java.util.*;
|
||||
* @see com.egzosn.pay.ali.api.AliPayService
|
||||
*/
|
||||
public class AliPayService extends BasePayService {
|
||||
protected final Log log = LogFactory.getLog(AliPayService.class);
|
||||
protected final Log LOG = LogFactory.getLog(AliPayService.class);
|
||||
|
||||
|
||||
private String httpsReqUrl = "https://mapi.alipay.com/gateway.do";
|
||||
private String queryReqUrl = "https://openapi.alipay.com/gateway.do";
|
||||
private String HTTPS_REQ_URL = "https://mapi.alipay.com/gateway.do";
|
||||
private String QUERY_REQ_URL = "https://openapi.alipay.com/gateway.do";
|
||||
|
||||
public AliPayService(PayConfigStorage payConfigStorage) {
|
||||
super(payConfigStorage);
|
||||
@@ -49,7 +49,7 @@ public class AliPayService extends BasePayService {
|
||||
|
||||
|
||||
public String getHttpsVerifyUrl() {
|
||||
return httpsReqUrl + "?service=notify_verify";
|
||||
return HTTPS_REQ_URL + "?service=notify_verify";
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -62,14 +62,14 @@ public class AliPayService extends BasePayService {
|
||||
public boolean verify(Map<String, Object> params) {
|
||||
|
||||
if (params.get("sign") == null || params.get("notify_id") == null) {
|
||||
log.debug("支付宝支付异常:params:" + params);
|
||||
LOG.debug("支付宝支付异常:params:" + params);
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
return signVerify(params, (String) params.get("sign")) && verifySource((String) params.get("notify_id"));
|
||||
} catch (PayErrorException e) {
|
||||
e.printStackTrace();
|
||||
LOG.error(e);
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -299,7 +299,7 @@ public class AliPayService extends BasePayService {
|
||||
StringBuffer formHtml = new StringBuffer();
|
||||
|
||||
formHtml.append("<form id=\"_alipaysubmit_\" name=\"alipaysubmit\" action=\"" )
|
||||
.append( httpsReqUrl)
|
||||
.append( HTTPS_REQ_URL)
|
||||
.append( "?_input_charset=" )
|
||||
.append( payConfigStorage.getInputCharset())
|
||||
.append( "\" method=\"")
|
||||
@@ -447,7 +447,7 @@ public class AliPayService extends BasePayService {
|
||||
parameters.put("biz_content", JSON.toJSONString(bizContent));
|
||||
//设置签名
|
||||
setSign(parameters);
|
||||
return callback.perform(requestTemplate.getForObject(queryReqUrl + "?" + UriVariables.getMapToParameters(parameters), JSONObject.class));
|
||||
return callback.perform(requestTemplate.getForObject(QUERY_REQ_URL + "?" + UriVariables.getMapToParameters(parameters), JSONObject.class));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -521,7 +521,7 @@ public class AliPayService extends BasePayService {
|
||||
parameters.put("biz_content", JSON.toJSONString(bizContent));
|
||||
//设置签名
|
||||
setSign(parameters);
|
||||
return callback.perform(requestTemplate.getForObject(queryReqUrl + "?" + UriVariables.getMapToParameters(parameters), JSONObject.class));
|
||||
return callback.perform(requestTemplate.getForObject(QUERY_REQ_URL + "?" + UriVariables.getMapToParameters(parameters), JSONObject.class));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -553,7 +553,7 @@ public class AliPayService extends BasePayService {
|
||||
parameters.put("biz_content", getContentToJson(tradeNoOrBillDate.toString(), outTradeNoBillType));
|
||||
//设置签名
|
||||
setSign(parameters);
|
||||
return callback.perform(requestTemplate.getForObject(queryReqUrl + "?" + UriVariables.getMapToParameters(parameters), JSONObject.class));
|
||||
return callback.perform(requestTemplate.getForObject(QUERY_REQ_URL + "?" + UriVariables.getMapToParameters(parameters), JSONObject.class));
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -16,22 +16,35 @@ import java.util.concurrent.locks.ReentrantLock;
|
||||
public abstract class BasePayConfigStorage implements PayConfigStorage{
|
||||
|
||||
|
||||
// ali rsa_private 商户私钥,pkcs8格式
|
||||
//wx api_key 应用私钥(生成签名时使用)
|
||||
private volatile String keyPrivate ;
|
||||
// 支付平台公钥(签名校验使用)
|
||||
/**
|
||||
* 应用私钥,rsa_private pkcs8格式 生成签名时使用
|
||||
*/
|
||||
private volatile String keyPrivate;
|
||||
/**
|
||||
* 支付平台公钥(签名校验使用)
|
||||
*/
|
||||
private volatile String keyPublic;
|
||||
//异步回调地址
|
||||
/**
|
||||
* 异步回调地址
|
||||
*/
|
||||
private volatile String notifyUrl;
|
||||
//同步回调地址
|
||||
/**
|
||||
* 同步回调地址,支付完成后展示的页面
|
||||
*/
|
||||
private volatile String returnUrl;;
|
||||
//签名加密类型
|
||||
/**
|
||||
* 签名加密类型
|
||||
*/
|
||||
private volatile String signType;
|
||||
//字符类型
|
||||
/**
|
||||
* 字符类型
|
||||
*/
|
||||
private volatile String inputCharset;
|
||||
|
||||
|
||||
//支付类型 aliPay 支付宝, wxPay微信..等等,开发者自定义,唯一
|
||||
/**
|
||||
* 支付类型 aliPay 支付宝, wxPay微信..等等,扩展支付模块定义唯一。
|
||||
*/
|
||||
private volatile String payType;
|
||||
|
||||
/**
|
||||
@@ -40,13 +53,21 @@ public abstract class BasePayConfigStorage implements PayConfigStorage{
|
||||
private volatile MsgType msgType;
|
||||
|
||||
|
||||
// 访问令牌 每次请求其他方法都要传入的值
|
||||
/**
|
||||
* 访问令牌 每次请求其他方法都要传入的值
|
||||
*/
|
||||
private volatile String accessToken;
|
||||
// access token 到期时间时间戳
|
||||
/**
|
||||
* access token 到期时间时间戳
|
||||
*/
|
||||
private volatile long expiresTime;
|
||||
//授权码锁
|
||||
/**
|
||||
* 授权码锁
|
||||
*/
|
||||
private Lock accessTokenLock = new ReentrantLock();
|
||||
|
||||
/**
|
||||
* 是否为沙箱环境,默认为正式环境
|
||||
*/
|
||||
private boolean isTest = false;
|
||||
|
||||
|
||||
@@ -77,6 +98,7 @@ public abstract class BasePayConfigStorage implements PayConfigStorage{
|
||||
this.notifyUrl = notifyUrl;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getReturnUrl() {
|
||||
return returnUrl;
|
||||
|
||||
@@ -14,21 +14,14 @@ import java.util.concurrent.locks.Lock;
|
||||
*/
|
||||
public interface PayConfigStorage {
|
||||
|
||||
/*
|
||||
/**
|
||||
* 应用id
|
||||
* @return 应用id
|
||||
*/
|
||||
String getAppid();
|
||||
|
||||
/**
|
||||
* 合作商唯一标识
|
||||
* @see #getPid() 代替者
|
||||
* @return 合作商唯一标识
|
||||
*/
|
||||
@Deprecated
|
||||
String getPartner();
|
||||
/**
|
||||
* 合作商唯一标识
|
||||
* @see #getPartner() 代替者
|
||||
* @return 合作商唯一标识
|
||||
*/
|
||||
String getPid();
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.egzosn.pay.common.api;
|
||||
|
||||
import com.egzosn.pay.common.bean.PayMessage;
|
||||
import com.egzosn.pay.common.bean.PayOutMessage;
|
||||
|
||||
import com.egzosn.pay.common.util.LogExceptionHandler;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
@@ -43,18 +44,32 @@ import java.util.concurrent.Future;
|
||||
*/
|
||||
public class PayMessageRouter {
|
||||
|
||||
protected final Log log = LogFactory.getLog(PayMessageRouter.class);
|
||||
|
||||
protected final Log LOG = LogFactory.getLog(PayMessageRouter.class);
|
||||
/**
|
||||
* 异步线程大小
|
||||
*/
|
||||
private static final int DEFAULT_THREAD_POOL_SIZE = 100;
|
||||
|
||||
/**
|
||||
* 规则集
|
||||
*/
|
||||
private final List<PayMessageRouterRule> rules = new ArrayList<PayMessageRouterRule>();
|
||||
|
||||
/**
|
||||
* 支付服务
|
||||
*/
|
||||
private final PayService payService;
|
||||
|
||||
/**
|
||||
* 异步线程处理器
|
||||
*/
|
||||
private ExecutorService executorService;
|
||||
|
||||
/**
|
||||
* 支付异常处理器
|
||||
*/
|
||||
private PayErrorExceptionHandler exceptionHandler;
|
||||
|
||||
/**
|
||||
* 根据支付服务创建路由
|
||||
* @param payService 支付服务
|
||||
*/
|
||||
public PayMessageRouter(PayService payService) {
|
||||
this.payService = payService;
|
||||
this.executorService = Executors.newFixedThreadPool(DEFAULT_THREAD_POOL_SIZE);
|
||||
@@ -130,6 +145,7 @@ public class PayMessageRouter {
|
||||
if(rule.isAsync()) {
|
||||
futures.add(
|
||||
executorService.submit(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
rule.service(payMessage, payService, exceptionHandler);
|
||||
}
|
||||
@@ -138,7 +154,7 @@ public class PayMessageRouter {
|
||||
} else {
|
||||
res = rule.service(payMessage, payService, exceptionHandler);
|
||||
// 在同步操作结束,session访问结束
|
||||
log.debug("End session access: async=false, fromPay=" + payMessage.getFromPay());
|
||||
LOG.debug("End session access: async=false, fromPay=" + payMessage.getFromPay());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -149,12 +165,12 @@ public class PayMessageRouter {
|
||||
for (Future future : futures) {
|
||||
try {
|
||||
future.get();
|
||||
log.debug("End session access: async=true, fromPay=" + payMessage.getFromPay());
|
||||
LOG.debug("End session access: async=true, fromPay=" + payMessage.getFromPay());
|
||||
|
||||
} catch (InterruptedException e) {
|
||||
log.error("Error happened when wait task finish", e);
|
||||
LOG.error("Error happened when wait task finish", e);
|
||||
} catch (ExecutionException e) {
|
||||
log.error("Error happened when wait task finish", e);
|
||||
LOG.error("Error happened when wait task finish", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2017 the original huodull or egan.
|
||||
* Copyright 2002-2017 the original egan.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -23,6 +23,7 @@ package com.egzosn.pay.common.bean;
|
||||
* email egzosn@gmail.com
|
||||
* date 2017/2/7 9:52
|
||||
* </pre>
|
||||
* 请求方式
|
||||
*/
|
||||
public enum MethodType {
|
||||
GET, POST
|
||||
|
||||
@@ -32,9 +32,13 @@ import static com.egzosn.pay.common.http.UriVariables.getMapToParameters;
|
||||
* </pre>
|
||||
*/
|
||||
public class ClientHttpRequest<T> extends HttpEntityEnclosingRequestBase implements org.apache.http.client.ResponseHandler<T>{
|
||||
//http请求
|
||||
/**
|
||||
* http请求方式 get pos
|
||||
*/
|
||||
private MethodType method;
|
||||
//响应类型
|
||||
/**
|
||||
* 响应类型
|
||||
*/
|
||||
private Class<T> responseType;
|
||||
|
||||
|
||||
@@ -43,40 +47,80 @@ public class ClientHttpRequest<T> extends HttpEntityEnclosingRequestBase impleme
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 空构造
|
||||
*/
|
||||
public ClientHttpRequest() {
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据请求地址 请求方法,请求内容对象
|
||||
* @param uri 请求地址
|
||||
* @param method 请求方法
|
||||
* @param request 请求内容
|
||||
*/
|
||||
public ClientHttpRequest(URI uri, MethodType method, Object request) {
|
||||
this.setURI(uri);
|
||||
this.method = method;
|
||||
this(uri, method);
|
||||
setParameters(request);
|
||||
}
|
||||
/**
|
||||
* 根据请求地址 请求方法
|
||||
* @param uri 请求地址
|
||||
* @param method 请求方法
|
||||
*/
|
||||
public ClientHttpRequest(URI uri, MethodType method) {
|
||||
this.setURI(uri);
|
||||
this.method = method;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据请求地址
|
||||
* @param uri 请求地址
|
||||
*/
|
||||
public ClientHttpRequest(URI uri) {
|
||||
this.setURI(uri);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据请求地址
|
||||
* @param uri 请求地址
|
||||
*/
|
||||
public ClientHttpRequest(String uri) {
|
||||
this.setURI(URI.create(uri));
|
||||
}
|
||||
/**
|
||||
* 根据请求地址 请求方法
|
||||
* @param uri 请求地址
|
||||
* @param method 请求方法
|
||||
*/
|
||||
public ClientHttpRequest(String uri, MethodType method) {
|
||||
this.setURI(URI.create(uri));
|
||||
this.method = method;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据请求地址 请求方法,请求内容对象
|
||||
* @param uri 请求地址
|
||||
* @param method 请求方法
|
||||
* @param request 请求内容
|
||||
*/
|
||||
public ClientHttpRequest(String uri, MethodType method, Object request) {
|
||||
this.setURI(URI.create(uri));
|
||||
this.method = method;
|
||||
this(uri, method);
|
||||
setParameters(request);
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置请求方式
|
||||
*
|
||||
* @param method 请求方式
|
||||
* {@link com.egzosn.pay.common.bean.MethodType} 请求方式
|
||||
*/
|
||||
public void setMethod(MethodType method) {
|
||||
this.method = method;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取请求方式
|
||||
* @return 请求方式
|
||||
*/
|
||||
@Override
|
||||
public String getMethod() {
|
||||
return method.name();
|
||||
@@ -153,11 +197,11 @@ public class ClientHttpRequest<T> extends HttpEntityEnclosingRequestBase impleme
|
||||
entity.writeTo((OutputStream)t);
|
||||
return t;
|
||||
} catch (InstantiationException e) {
|
||||
e.printStackTrace();
|
||||
throw new PayErrorException(new PayException("InstantiationException", e.getMessage()));
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
throw new PayErrorException(new PayException("IllegalAccessException", e.getMessage()));
|
||||
}
|
||||
throw new HttpResponseException(statusLine.getStatusCode(), responseType + " 无法进行类型转换");
|
||||
|
||||
}
|
||||
}
|
||||
String charset = "UTF-8";
|
||||
@@ -174,7 +218,7 @@ public class ClientHttpRequest<T> extends HttpEntityEnclosingRequestBase impleme
|
||||
try {
|
||||
return JSON.parseObject(result, responseType);
|
||||
}catch (JSONException e){
|
||||
throw new PayErrorException(new PayException("failure", "类型转化异常,contentType:" + entity.getContentType().getValue(), result));
|
||||
throw new PayErrorException(new PayException("failure", String.format("类型转化异常,contentType: %s\n%s", entity.getContentType().getValue(), e.getMessage() ), result));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,8 @@ package com.egzosn.pay.common.util;
|
||||
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.egzosn.pay.common.bean.result.PayException;
|
||||
import com.egzosn.pay.common.exception.PayErrorException;
|
||||
import org.jdom2.Document;
|
||||
import org.jdom2.Element;
|
||||
import org.jdom2.JDOMException;
|
||||
@@ -38,9 +40,9 @@ public class XML {
|
||||
try (InputStream in = new ByteArrayInputStream(content.getBytes("UTF-8"))){
|
||||
return (JSONObject) inputStream2Map(in, null);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
throw new PayErrorException(new PayException("IOException", e.getMessage()));
|
||||
}
|
||||
return null;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -58,9 +60,8 @@ public class XML {
|
||||
try {
|
||||
return (JSONObject)inputStream2Map(in, null);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
throw new PayErrorException(new PayException("IOException", e.getMessage()));
|
||||
}
|
||||
return null;
|
||||
|
||||
|
||||
}
|
||||
@@ -95,7 +96,7 @@ public class XML {
|
||||
m.put(k, v);
|
||||
}
|
||||
} catch (JDOMException e) {
|
||||
e.printStackTrace();
|
||||
throw new PayErrorException(new PayException("JDOMException", e.getMessage()));
|
||||
}
|
||||
return m;
|
||||
}
|
||||
|
||||
@@ -39,6 +39,7 @@ public enum SignUtils {
|
||||
* @param characterEncoding 编码格式
|
||||
* @return 签名结果
|
||||
*/
|
||||
@Override
|
||||
public boolean verify(String text, String sign, String key, String characterEncoding) {
|
||||
return com.egzosn.pay.common.util.sign.encrypt.MD5.verify(text, sign, key, characterEncoding);
|
||||
}
|
||||
@@ -87,7 +88,7 @@ public enum SignUtils {
|
||||
* @return 去掉空值与签名参数后的新签名,拼接后字符串
|
||||
*/
|
||||
public static String parameterText(Map parameters, String separator) {
|
||||
return parameterText(parameters, separator, "sign", "key", "appId", "sign_type");
|
||||
return parameterText(parameters, separator, "sign", "key", "sign_type");
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
|
||||
### 快速入门
|
||||
#####1.支付整合配置
|
||||
##### 1.支付整合配置
|
||||
```java
|
||||
|
||||
|
||||
@@ -220,7 +220,7 @@ public class PayResponse {
|
||||
|
||||
```
|
||||
|
||||
#####2.支付处理器与拦截器简单实现
|
||||
##### 2.支付处理器与拦截器简单实现
|
||||
|
||||
```java
|
||||
/**
|
||||
@@ -271,7 +271,7 @@ public class PayResponse {
|
||||
```
|
||||
|
||||
|
||||
#####3.支付响应PayResponse的获取
|
||||
##### 3.支付响应PayResponse的获取
|
||||
|
||||
|
||||
```java
|
||||
@@ -318,7 +318,7 @@ public class ApyAccountService {
|
||||
```
|
||||
|
||||
|
||||
#####4.根据账户id与业务id,组拼订单信息(支付宝、微信支付订单)获取支付信息所需的数据
|
||||
##### 4.根据账户id与业务id,组拼订单信息(支付宝、微信支付订单)获取支付信息所需的数据
|
||||
|
||||
```java
|
||||
|
||||
@@ -466,7 +466,7 @@ public class ApyAccountService {
|
||||
|
||||
```
|
||||
|
||||
#####5.支付回调
|
||||
##### 5.支付回调
|
||||
```java
|
||||
|
||||
|
||||
|
||||
@@ -23,7 +23,9 @@ public class ApyAccountService {
|
||||
@Resource
|
||||
private AutowireCapableBeanFactory spring;
|
||||
|
||||
//缓存
|
||||
/**
|
||||
* 缓存
|
||||
*/
|
||||
private final static Map<Integer, PayResponse> payResponses = new HashMap<Integer, PayResponse>();
|
||||
|
||||
/**
|
||||
|
||||
@@ -92,10 +92,14 @@ public class PayResponse {
|
||||
router
|
||||
.rule()
|
||||
.async(false)
|
||||
.msgType(MsgType.text.name()) //消息类型
|
||||
.payType(PayType.aliPay.name()) //支付账户事件类型
|
||||
.interceptor(new AliPayMessageInterceptor()) //拦截器
|
||||
.handler(autowire(new AliPayMessageHandler(payId))) //处理器
|
||||
//消息类型
|
||||
.msgType(MsgType.text.name())
|
||||
//支付账户事件类型
|
||||
.payType(PayType.aliPay.name())
|
||||
//拦截器
|
||||
.interceptor(new AliPayMessageInterceptor())
|
||||
//处理器
|
||||
.handler(autowire(new AliPayMessageHandler(payId)))
|
||||
.end()
|
||||
.rule()
|
||||
.async(false)
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
|
||||
|
||||
##富友支付简单例子
|
||||
## 富友支付简单例子
|
||||
|
||||
####支付配置
|
||||
#### 支付配置
|
||||
|
||||
```java
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
```
|
||||
|
||||
|
||||
####创建支付服务
|
||||
#### 创建支付服务
|
||||
|
||||
```java
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
|
||||
```
|
||||
|
||||
####创建支付订单信息
|
||||
#### 创建支付订单信息
|
||||
|
||||
```java
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
```
|
||||
|
||||
|
||||
####网页支付
|
||||
#### 网页支付
|
||||
|
||||
```java
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
```
|
||||
|
||||
|
||||
####回调处理
|
||||
#### 回调处理
|
||||
|
||||
```java
|
||||
|
||||
|
||||
@@ -20,20 +20,10 @@ public class FuiouPayConfigStorage extends BasePayConfigStorage {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 合作商唯一标识
|
||||
*
|
||||
* @see #getPid() 代替者
|
||||
*/
|
||||
@Override
|
||||
public String getPartner () {
|
||||
return mchntCd;
|
||||
}
|
||||
|
||||
/**
|
||||
* 合作商唯一标识
|
||||
*
|
||||
* @see #getPartner() 代替者
|
||||
*/
|
||||
@Override
|
||||
public String getPid () {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
|
||||
|
||||
##友店支付简单例子
|
||||
## 友店支付简单例子
|
||||
|
||||
####支付配置
|
||||
#### 支付配置
|
||||
|
||||
```java
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
```
|
||||
|
||||
|
||||
####创建支付服务
|
||||
#### 创建支付服务
|
||||
|
||||
```java
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
|
||||
```
|
||||
|
||||
####创建支付订单信息
|
||||
#### 创建支付订单信息
|
||||
|
||||
```java
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
```
|
||||
|
||||
|
||||
####扫码付
|
||||
#### 扫码付
|
||||
|
||||
```java
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
```
|
||||
|
||||
|
||||
####回调处理
|
||||
#### 回调处理
|
||||
|
||||
```java
|
||||
|
||||
|
||||
@@ -12,7 +12,9 @@ import com.egzosn.pay.common.api.BasePayConfigStorage;
|
||||
public class WxYouDianPayConfigStorage extends BasePayConfigStorage {
|
||||
|
||||
|
||||
//账号
|
||||
/**
|
||||
* 账号
|
||||
*/
|
||||
public volatile String seller;
|
||||
|
||||
|
||||
@@ -26,11 +28,6 @@ public class WxYouDianPayConfigStorage extends BasePayConfigStorage {
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getPartner() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPid() {
|
||||
return null;
|
||||
|
||||
@@ -32,15 +32,23 @@ import java.util.concurrent.locks.Lock;
|
||||
* date 2017/01/12 22:58
|
||||
*/
|
||||
public class WxYouDianPayService extends BasePayService {
|
||||
protected final Log log = LogFactory.getLog(WxYouDianPayService.class);
|
||||
//登录获取授权码
|
||||
public final static String loginUrl = "http://life.51youdian.com/Api/CheckoutCounter/login";
|
||||
//刷新授权码
|
||||
public final static String resetLoginUrl = "http://life.51youdian.com/Api/CheckoutCounter/resetLogin";
|
||||
//查看付款订单状态
|
||||
public final static String unifiedorderStatusUrl = "http://life.51youdian.com/Api/CheckoutCounter/unifiedorderStatus";
|
||||
//预下单链接
|
||||
public final static String unifiedOrderUrl = "http://life.51youdian.com/Api/CheckoutCounter/unifiedorder";
|
||||
protected static final Log LOG = LogFactory.getLog(WxYouDianPayService.class);
|
||||
/**
|
||||
* 登录获取授权码
|
||||
*/
|
||||
public final static String LOGIN_URL = "http://life.51youdian.com/Api/CheckoutCounter/login";
|
||||
/**
|
||||
* 刷新授权码
|
||||
*/
|
||||
public final static String RESET_LOGIN_URL = "http://life.51youdian.com/Api/CheckoutCounter/resetLogin";
|
||||
/**
|
||||
* 查看付款订单状态
|
||||
*/
|
||||
public final static String UNIFIEDORDER_STATUS_URL = "http://life.51youdian.com/Api/CheckoutCounter/unifiedorderStatus";
|
||||
/**
|
||||
* 预下单链接
|
||||
*/
|
||||
public final static String UNIFIED_ORDER_URL = "http://life.51youdian.com/Api/CheckoutCounter/unifiedorder";
|
||||
|
||||
|
||||
/**
|
||||
@@ -51,9 +59,8 @@ public class WxYouDianPayService extends BasePayService {
|
||||
try {
|
||||
return getAccessToken(false);
|
||||
} catch (PayErrorException e) {
|
||||
e.printStackTrace();
|
||||
throw e;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -80,7 +87,7 @@ public class WxYouDianPayService extends BasePayService {
|
||||
StringBuilder param = new StringBuilder().append("access_token=").append(payConfigStorage.getAccessToken());
|
||||
String sign = createSign(param.toString() + apbNonce, payConfigStorage.getInputCharset());
|
||||
param.append("&apb_nonce=").append(apbNonce).append("&sign=").append(sign);
|
||||
JSONObject json = execute(resetLoginUrl + "?" + param.toString(), MethodType.GET, null );
|
||||
JSONObject json = execute(RESET_LOGIN_URL + "?" + param.toString(), MethodType.GET, null );
|
||||
int errorcode = json.getIntValue("errorcode");
|
||||
if (0 == errorcode){
|
||||
payConfigStorage.updateAccessToken(payConfigStorage.getAccessToken(), 7200);
|
||||
@@ -112,7 +119,7 @@ public class WxYouDianPayService extends BasePayService {
|
||||
String sign = createSign(SignUtils.parameterText(data, "") + apbNonce, payConfigStorage.getInputCharset());
|
||||
String queryParam = SignUtils.parameterText(data) + "&apb_nonce=" + apbNonce + "&sign=" + sign;
|
||||
|
||||
JSONObject json = execute(loginUrl + "?" + queryParam, MethodType.GET, null);
|
||||
JSONObject json = execute(LOGIN_URL + "?" + queryParam, MethodType.GET, null);
|
||||
payConfigStorage.updateAccessToken(json.getString("access_token"), json.getLongValue("viptime"));
|
||||
return json;
|
||||
}
|
||||
@@ -124,7 +131,7 @@ public class WxYouDianPayService extends BasePayService {
|
||||
* @return 请求地址
|
||||
*/
|
||||
public String getHttpsVerifyUrl() {
|
||||
return unifiedorderStatusUrl;
|
||||
return UNIFIEDORDER_STATUS_URL;
|
||||
}
|
||||
/**
|
||||
* 回调校验
|
||||
@@ -135,15 +142,15 @@ public class WxYouDianPayService extends BasePayService {
|
||||
@Override
|
||||
public boolean verify(Map<String, Object> params) {
|
||||
if (!"SUCCESS".equals(params.get("return_code"))){
|
||||
log.debug(String.format("友店微信支付异常:return_code=%s,参数集=%s", params.get("return_code"), params));
|
||||
LOG.debug(String.format("友店微信支付异常:return_code=%s,参数集=%s", params.get("return_code"), params));
|
||||
return false;
|
||||
}
|
||||
if(params.get("sign") == null) {log.debug("友店微信支付异常:签名为空!out_trade_no=" + params.get("out_trade_no"));}
|
||||
if(params.get("sign") == null) {LOG.debug("友店微信支付异常:签名为空!out_trade_no=" + params.get("out_trade_no"));}
|
||||
|
||||
try {
|
||||
return signVerify(params, (String) params.get("sign")) && verifySource((String)params.get("out_trade_no"));
|
||||
} catch (PayErrorException e) {
|
||||
e.printStackTrace();
|
||||
LOG.error(e.getMessage());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -217,7 +224,7 @@ public class WxYouDianPayService extends BasePayService {
|
||||
if ("401".equals(error.getErrorCode()) || "500".equals(error.getErrorCode())) {
|
||||
try {
|
||||
int sleepMillis = retrySleepMillis * (1 << retryTimes);
|
||||
log.debug(String.format("友店微信系统繁忙,(%s)ms 后重试(第%s次)", sleepMillis, retryTimes + 1));
|
||||
LOG.debug(String.format("友店微信系统繁忙,(%s)ms 后重试(第%s次)", sleepMillis, retryTimes + 1));
|
||||
Thread.sleep(sleepMillis);
|
||||
} catch (InterruptedException e1) {
|
||||
throw new PayErrorException(new YdPayError(-1, "友店支付服务端重试失败", e1.getMessage()));
|
||||
@@ -255,14 +262,13 @@ public class WxYouDianPayService extends BasePayService {
|
||||
data.put("PayMoney", data.remove("paymoney"));
|
||||
String params = SignUtils.parameterText(data) + "&apb_nonce=" + apbNonce + "&sign=" + sign;
|
||||
try {
|
||||
JSONObject json = execute(unifiedOrderUrl+ "?" + params, MethodType.GET, null);
|
||||
JSONObject json = execute(UNIFIED_ORDER_URL+ "?" + params, MethodType.GET, null);
|
||||
//友店比较特殊,需要在下完预订单后,自己存储 order_sn 对应 微信官方文档 out_trade_no
|
||||
order.setOutTradeNo(json.getString("order_sn"));
|
||||
return json;
|
||||
} catch (PayErrorException e) {
|
||||
e.printStackTrace();
|
||||
throw e;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -312,14 +318,16 @@ public class WxYouDianPayService extends BasePayService {
|
||||
|
||||
/**
|
||||
* 具体需要返回的数据为
|
||||
*return_code 返回码只有SUCCESS和FAIL
|
||||
*return_msg 返回具体信息
|
||||
*nonce_str 您的服务器新生成随机生成32位字符串
|
||||
*sign 为签名,签名规则是您需要发送的所有数据(除了sign)按照字典升序排列后加上&key=xxxxxxxx您的密钥后md5加密,最后转成小写
|
||||
*最后把得到的所有需要返回的数据用json格式化成json对象格式如下
|
||||
*{"return_code":"SUCCESS","return_msg":"ok","nonce_str":"dddddddddddddddddddd’,’sign’:’sdddddddddddddddddd"}
|
||||
* @param code return_code
|
||||
* return_code 返回码只有SUCCESS和FAIL
|
||||
* return_msg 返回具体信息
|
||||
* nonce_str 您的服务器新生成随机生成32位字符串
|
||||
* sign 为签名,签名规则是您需要发送的所有数据(除了sign)按照字典升序排列后加上&key=xxxxxxxx您的密钥后md5加密,最后转成小写
|
||||
* 最后把得到的所有需要返回的数据用json格式化成json对象格式如下
|
||||
* {"return_code":"SUCCESS","return_msg":"ok","nonce_str":"dddddddddddddddddddd’,’sign’:’sdddddddddddddddddd"}
|
||||
*
|
||||
* @param code return_code
|
||||
* @param message return_msg
|
||||
*
|
||||
* @return 返回输出消息
|
||||
*/
|
||||
@Override
|
||||
|
||||
@@ -11,9 +11,13 @@ import com.egzosn.pay.common.bean.TransactionType;
|
||||
*/
|
||||
public enum YoudianTransactionType implements TransactionType {
|
||||
|
||||
//扫码付
|
||||
/**
|
||||
* 扫码付
|
||||
*/
|
||||
NATIVE("unifiedorder"),
|
||||
//刷卡付
|
||||
/**
|
||||
* 刷卡付
|
||||
*/
|
||||
MICROPAY("micropay");//暂未接触
|
||||
|
||||
private String method;
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
|
||||
|
||||
##微信支付简单例子
|
||||
## 微信支付简单例子
|
||||
|
||||
####支付配置
|
||||
#### 支付配置
|
||||
|
||||
```java
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
|
||||
```
|
||||
|
||||
####创建支付服务
|
||||
#### 创建支付服务
|
||||
|
||||
```java
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
|
||||
```
|
||||
|
||||
####创建支付订单信息
|
||||
#### 创建支付订单信息
|
||||
|
||||
```java
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
|
||||
```
|
||||
|
||||
####扫码付
|
||||
#### 扫码付
|
||||
|
||||
```java
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
|
||||
```
|
||||
|
||||
####APP支付
|
||||
#### APP支付
|
||||
|
||||
```java
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
|
||||
```
|
||||
|
||||
####网页支付
|
||||
#### 网页支付
|
||||
|
||||
```java
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
|
||||
```
|
||||
|
||||
####条码付 刷卡付
|
||||
#### 条码付 刷卡付
|
||||
|
||||
```java
|
||||
|
||||
@@ -121,7 +121,7 @@
|
||||
|
||||
```
|
||||
|
||||
####回调处理
|
||||
#### 回调处理
|
||||
|
||||
```java
|
||||
|
||||
@@ -139,7 +139,7 @@
|
||||
|
||||
```
|
||||
|
||||
####支付订单查询
|
||||
#### 支付订单查询
|
||||
|
||||
```java
|
||||
|
||||
@@ -148,7 +148,7 @@
|
||||
```
|
||||
|
||||
|
||||
####交易关闭接口
|
||||
#### 交易关闭接口
|
||||
```java
|
||||
|
||||
Map result = service..query("微信单号", "我方系统单号");
|
||||
@@ -156,7 +156,7 @@
|
||||
```
|
||||
|
||||
|
||||
####申请退款接口
|
||||
#### 申请退款接口
|
||||
```java
|
||||
|
||||
Map result = service.refund("微信单号", "我方系统单号", "退款金额", "订单总金额");
|
||||
@@ -164,14 +164,14 @@
|
||||
```
|
||||
|
||||
|
||||
####查询退款
|
||||
#### 查询退款
|
||||
```java
|
||||
|
||||
Map result = service.refundquery("微信单号", "我方系统单号");
|
||||
|
||||
```
|
||||
|
||||
####下载对账单
|
||||
#### 下载对账单
|
||||
```java
|
||||
|
||||
Map result = service.downloadbill("账单时间:日账单格式为yyyy-MM-dd,月账单格式为yyyy-MM", "账单类型");
|
||||
|
||||
@@ -15,8 +15,13 @@ public class WxPayConfigStorage extends BasePayConfigStorage {
|
||||
|
||||
|
||||
public String appSecret;
|
||||
/**
|
||||
* 应用id
|
||||
*/
|
||||
public String appid ;
|
||||
// 商户号 合作者id
|
||||
/**
|
||||
* 商户号 合作者id
|
||||
*/
|
||||
public String mchId;
|
||||
|
||||
|
||||
@@ -35,17 +40,11 @@ public class WxPayConfigStorage extends BasePayConfigStorage {
|
||||
this.appid = appid;
|
||||
}
|
||||
|
||||
/**
|
||||
* 合作商唯一标识
|
||||
* @see #getPid() 代替者
|
||||
*/
|
||||
public String getPartner() {
|
||||
return mchId;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 合作商唯一标识
|
||||
* @see #getPartner() 代替者
|
||||
*/
|
||||
@Override
|
||||
public String getPid() {
|
||||
@@ -53,6 +52,15 @@ public class WxPayConfigStorage extends BasePayConfigStorage {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 合作商唯一标识
|
||||
*/
|
||||
public void setPid(String mchId) {
|
||||
this.mchId = mchId;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public String getSeller() {
|
||||
return null;
|
||||
|
||||
@@ -10,6 +10,7 @@ import com.egzosn.pay.common.exception.PayErrorException;
|
||||
import com.egzosn.pay.common.http.HttpConfigStorage;
|
||||
import com.egzosn.pay.common.util.MatrixToImageWriter;
|
||||
import com.egzosn.pay.common.util.sign.SignUtils;
|
||||
import com.egzosn.pay.common.util.str.StringUtils;
|
||||
import com.egzosn.pay.wx.bean.WxPayError;
|
||||
import com.egzosn.pay.wx.bean.WxTransactionType;
|
||||
import com.egzosn.pay.common.util.XML;
|
||||
@@ -24,41 +25,51 @@ import java.text.SimpleDateFormat;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* 微信支付服务
|
||||
* @author egan
|
||||
* <pre>
|
||||
* email egzosn@gmail.com
|
||||
* date 2016-5-18 14:09:01
|
||||
* </pre>
|
||||
* 微信支付服务
|
||||
*
|
||||
* @author egan
|
||||
* <pre>
|
||||
* email egzosn@gmail.com
|
||||
* date 2016-5-18 14:09:01
|
||||
* </pre>
|
||||
*/
|
||||
public class WxPayService extends BasePayService {
|
||||
protected final Log log = LogFactory.getLog(WxPayService.class);
|
||||
protected final Log LOG = LogFactory.getLog(WxPayService.class);
|
||||
|
||||
|
||||
|
||||
|
||||
public final static String uri = "https://api.mch.weixin.qq.com/";
|
||||
/**
|
||||
* 微信请求地址
|
||||
*/
|
||||
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 orderqueryUrl = "https://api.mch.weixin.qq.com/pay/orderquery";
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 创建支付服务
|
||||
* @param payConfigStorage 微信对应的支付配置
|
||||
*/
|
||||
public WxPayService(PayConfigStorage payConfigStorage) {
|
||||
super(payConfigStorage);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建支付服务
|
||||
* @param payConfigStorage 微信对应的支付配置
|
||||
* @param configStorage 微信对应的网络配置,包含代理配置、ssl证书配置
|
||||
*/
|
||||
public WxPayService(PayConfigStorage payConfigStorage, HttpConfigStorage configStorage) {
|
||||
super(payConfigStorage, configStorage);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据交易类型获取url
|
||||
*
|
||||
* @param transactionType 交易类型
|
||||
* @return 请求url
|
||||
*/
|
||||
private String getUrl(TransactionType transactionType){
|
||||
private String getUrl(TransactionType transactionType) {
|
||||
|
||||
return uri + transactionType.getMethod();
|
||||
return URI + transactionType.getMethod();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -70,19 +81,19 @@ public class WxPayService extends BasePayService {
|
||||
@Override
|
||||
public boolean verify(Map<String, Object> params) {
|
||||
if (!"SUCCESS".equals(params.get("return_code"))){
|
||||
log.debug(String.format("微信支付异常:return_code=%s,参数集=%s", params.get("return_code"), params));
|
||||
LOG.debug(String.format("微信支付异常:return_code=%s,参数集=%s", params.get("return_code"), params));
|
||||
return false;
|
||||
}
|
||||
|
||||
if(null == params.get("sign")) {
|
||||
log.debug("微信支付异常:签名为空!out_trade_no=" + params.get("out_trade_no"));
|
||||
LOG.debug("微信支付异常:签名为空!out_trade_no=" + params.get("out_trade_no"));
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
return signVerify(params, (String) params.get("sign")) && verifySource((String)params.get("out_trade_no"));
|
||||
return signVerify(params, (String) params.get("sign")) && verifySource((String) params.get("out_trade_no"));
|
||||
} catch (PayErrorException e) {
|
||||
e.printStackTrace();
|
||||
LOG.error(e);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -90,6 +101,7 @@ public class WxPayService extends BasePayService {
|
||||
|
||||
/**
|
||||
* 微信是否也需要再次校验来源,进行订单查询
|
||||
*
|
||||
* @param id 商户单号
|
||||
* @return true通过
|
||||
*/
|
||||
@@ -101,19 +113,22 @@ public class WxPayService extends BasePayService {
|
||||
|
||||
/**
|
||||
* 根据反馈回来的信息,生成签名结果
|
||||
*
|
||||
* @param params 通知返回来的参数数组
|
||||
* @param sign 比对的签名结果
|
||||
* @param sign 比对的签名结果
|
||||
* @return 生成的签名结果
|
||||
*/
|
||||
@Override
|
||||
public boolean signVerify(Map<String, Object> params, String sign) {
|
||||
return SignUtils.valueOf(payConfigStorage.getSignType()).verify(params, sign, "&key=" + payConfigStorage.getKeyPublic(), payConfigStorage.getInputCharset());
|
||||
return SignUtils.valueOf(payConfigStorage.getSignType()).verify(params, sign, "&key=" + payConfigStorage.getKeyPublic(), payConfigStorage.getInputCharset());
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取公共参数
|
||||
*
|
||||
* @return 公共参数
|
||||
*/
|
||||
private Map<String,Object> getPublicParameters() {
|
||||
private Map<String, Object> getPublicParameters() {
|
||||
|
||||
Map<String, Object> parameters = new TreeMap<String, Object>();
|
||||
parameters.put("appid", payConfigStorage.getAppid());
|
||||
@@ -139,20 +154,20 @@ public class WxPayService extends BasePayService {
|
||||
parameters.put("body", order.getSubject());// 购买支付信息
|
||||
parameters.put("out_trade_no", order.getOutTradeNo());// 订单号
|
||||
parameters.put("spbill_create_ip", "192.168.1.150");
|
||||
parameters.put("total_fee", order.getPrice().multiply(new BigDecimal(100)).setScale( 0, BigDecimal.ROUND_HALF_UP).intValue());// 总金额单位为分
|
||||
parameters.put("total_fee", order.getPrice().multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_UP).intValue());// 总金额单位为分
|
||||
|
||||
parameters.put("attach", order.getBody());
|
||||
parameters.put("notify_url", payConfigStorage.getNotifyUrl());
|
||||
parameters.put("trade_type", order.getTransactionType().getType());
|
||||
|
||||
switch ((WxTransactionType)order.getTransactionType()){
|
||||
switch ((WxTransactionType) order.getTransactionType()) {
|
||||
//刷卡付
|
||||
case MICROPAY:
|
||||
parameters.put("auth_code", order.getAuthCode());
|
||||
parameters.remove("notify_url");
|
||||
parameters.remove("trade_type");
|
||||
break;
|
||||
// 公众号支付
|
||||
// 公众号支付
|
||||
case JSAPI:
|
||||
parameters.put("openid", order.getOpenid());
|
||||
break;
|
||||
@@ -166,7 +181,7 @@ public class WxPayService extends BasePayService {
|
||||
//场景类型
|
||||
" {\"type\": \"Wap\", " +
|
||||
//WAP网站URL地址 同步回调地址
|
||||
" \"wap_url\": \""+ payConfigStorage.getReturnUrl()+"\"," +
|
||||
" \"wap_url\": \"" + payConfigStorage.getReturnUrl() + "\"," +
|
||||
//WAP 网站名
|
||||
" \"wap_name\": \"支付充值\"}}";
|
||||
|
||||
@@ -175,20 +190,16 @@ public class WxPayService extends BasePayService {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
String sign = createSign(SignUtils.parameterText(parameters), payConfigStorage.getInputCharset());
|
||||
parameters.put("sign", sign);
|
||||
|
||||
String requestXML = XML.getMap2Xml(parameters);
|
||||
log.debug("requestXML:" + requestXML);
|
||||
LOG.debug("requestXML:" + requestXML);
|
||||
//调起支付的参数列表
|
||||
JSONObject result = requestTemplate.postForObject(getUrl(order.getTransactionType()), requestXML, JSONObject.class);
|
||||
|
||||
if (!"SUCCESS".equals(result.get("return_code"))){
|
||||
throw new PayErrorException(new WxPayError(result.getString("return_code"), result.getString("return_msg"), result.toJSONString()));
|
||||
if (!"SUCCESS".equals(result.get("return_code"))) {
|
||||
throw new PayErrorException(new WxPayError(result.getString("return_code"), result.getString("return_msg"), result.toJSONString()));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -208,22 +219,26 @@ public class WxPayService extends BasePayService {
|
||||
JSONObject result = unifiedOrder(order);
|
||||
|
||||
//如果是扫码支付或者刷卡付无需处理,直接返回
|
||||
if (WxTransactionType.NATIVE == order.getTransactionType() || WxTransactionType.MICROPAY == order.getTransactionType()|| WxTransactionType.MWEB == order.getTransactionType()) {
|
||||
if (WxTransactionType.NATIVE == order.getTransactionType() || WxTransactionType.MICROPAY == order.getTransactionType() || WxTransactionType.MWEB == order.getTransactionType()) {
|
||||
return result;
|
||||
}
|
||||
|
||||
SortedMap<String, Object> params = new TreeMap<String, Object>();
|
||||
params.put("appid", payConfigStorage.getAppid());
|
||||
params.put("partnerid", payConfigStorage.getPid());
|
||||
params.put("prepayid", result.get("prepay_id"));
|
||||
params.put("timestamp", System.currentTimeMillis() / 1000);
|
||||
params.put("noncestr", result.get("nonce_str"));
|
||||
|
||||
if (WxTransactionType.JSAPI == order.getTransactionType()){
|
||||
params.put("package", "prepay_id=" + result.get("prepay_id"));
|
||||
|
||||
params.put("partnerid", payConfigStorage.getPid());
|
||||
params.put("package", "prepay_id=" + result.get("prepay_id"));
|
||||
if (WxTransactionType.JSAPI == order.getTransactionType()) {
|
||||
params.put("signType", payConfigStorage.getSignType());
|
||||
}else if (WxTransactionType.APP == order.getTransactionType()){
|
||||
params.put("package", "Sign=WXPay");
|
||||
params.put("appId", payConfigStorage.getAppid());
|
||||
params.put("prepayid", result.get("prepay_id"));
|
||||
params.put("timeStamp", System.currentTimeMillis() / 1000);
|
||||
params.put("nonceStr", result.get("nonce_str"));
|
||||
} else if (WxTransactionType.APP == order.getTransactionType()) {
|
||||
params.put("appid", payConfigStorage.getAppid());
|
||||
params.put("prepayid", result.get("prepay_id"));
|
||||
params.put("timestamp", System.currentTimeMillis() / 1000);
|
||||
params.put("noncestr", result.get("nonce_str"));
|
||||
}
|
||||
String paySign = createSign(SignUtils.parameterText(params), payConfigStorage.getInputCharset());
|
||||
params.put("sign", paySign);
|
||||
@@ -233,26 +248,28 @@ public class WxPayService extends BasePayService {
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成并设置签名
|
||||
* 生成并设置签名
|
||||
*
|
||||
* @param parameters 请求参数
|
||||
* @return 请求参数
|
||||
*/
|
||||
private Map<String, Object> setSign(Map<String, Object> parameters){
|
||||
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", "appId"), payConfigStorage.getInputCharset());
|
||||
parameters.put("sign", sign);
|
||||
return parameters;
|
||||
}
|
||||
|
||||
/**
|
||||
* 签名
|
||||
* @param content 需要签名的内容 不包含key
|
||||
*
|
||||
* @param content 需要签名的内容 不包含key
|
||||
* @param characterEncoding 字符编码
|
||||
* @return 签名结果
|
||||
*/
|
||||
@Override
|
||||
public String createSign(String content, String characterEncoding) {
|
||||
return SignUtils.valueOf(payConfigStorage.getSignType().toUpperCase()).createSign(content, "&key=" + payConfigStorage.getKeyPrivate(), characterEncoding).toUpperCase();
|
||||
return SignUtils.valueOf(payConfigStorage.getSignType().toUpperCase()).createSign(content, "&key=" + payConfigStorage.getKeyPrivate(), characterEncoding).toUpperCase();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -266,17 +283,17 @@ public class WxPayService extends BasePayService {
|
||||
public Map<String, Object> getParameter2Map(Map<String, String[]> parameterMap, InputStream is) {
|
||||
TreeMap<String, Object> map = new TreeMap<String, Object>();
|
||||
try {
|
||||
return XML.inputStream2Map(is, map);
|
||||
return XML.inputStream2Map(is, map);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
throw new PayErrorException(new PayException("IOException", e.getMessage()));
|
||||
}
|
||||
return map;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取输出消息,用户返回给支付端
|
||||
*
|
||||
* @param code 状态
|
||||
* @param code 状态
|
||||
* @param message 消息
|
||||
* @return 返回输出消息
|
||||
*/
|
||||
@@ -289,12 +306,13 @@ public class WxPayService extends BasePayService {
|
||||
/**
|
||||
* 获取成功输出消息,用户返回给支付端
|
||||
* 主要用于拦截器中返回
|
||||
*
|
||||
* @param payMessage 支付回调消息
|
||||
* @return 返回输出消息
|
||||
*/
|
||||
@Override
|
||||
public PayOutMessage successPayOutMessage(PayMessage payMessage) {
|
||||
return PayOutMessage.XML().code("Success").content("成功").build();
|
||||
return PayOutMessage.XML().code("Success").content("成功").build();
|
||||
}
|
||||
|
||||
|
||||
@@ -308,11 +326,11 @@ public class WxPayService extends BasePayService {
|
||||
*/
|
||||
@Override
|
||||
public String buildRequest(Map<String, Object> orderInfo, MethodType method) {
|
||||
if (!"SUCCESS".equals(orderInfo.get("return_code")) ){
|
||||
if (!"SUCCESS".equals(orderInfo.get("return_code"))) {
|
||||
throw new PayErrorException(new WxPayError((String) orderInfo.get("return_code"), (String) orderInfo.get("return_msg")));
|
||||
}
|
||||
if (WxTransactionType.MWEB.equals(orderInfo.get("trade_type"))){
|
||||
return "<script type=\"text/javascript\">location.href=\""+ orderInfo.get("mweb_url")+";\"</script>";
|
||||
if (WxTransactionType.MWEB.equals(orderInfo.get("trade_type"))) {
|
||||
return "<script type=\"text/javascript\">location.href=\"" + orderInfo.get("mweb_url") + ";\"</script>";
|
||||
}
|
||||
throw new UnsupportedOperationException();
|
||||
|
||||
@@ -320,6 +338,7 @@ public class WxPayService extends BasePayService {
|
||||
|
||||
/**
|
||||
* 获取输出二维码,用户返回给支付端,
|
||||
*
|
||||
* @param order 发起支付的订单信息
|
||||
* @return 返回图片信息,支付时需要的
|
||||
*/
|
||||
@@ -332,11 +351,12 @@ public class WxPayService extends BasePayService {
|
||||
}
|
||||
|
||||
|
||||
return MatrixToImageWriter.writeInfoToJpgBuff((String) orderInfo.get("code_url"));
|
||||
return MatrixToImageWriter.writeInfoToJpgBuff((String) orderInfo.get("code_url"));
|
||||
}
|
||||
|
||||
/**
|
||||
* 刷卡付,pos主动扫码付款
|
||||
*
|
||||
* @param order 发起支付的订单信息
|
||||
* @return 返回支付结果
|
||||
*/
|
||||
@@ -350,14 +370,14 @@ public class WxPayService extends BasePayService {
|
||||
/**
|
||||
* 交易查询接口
|
||||
*
|
||||
* @param transactionId 微信支付平台订单号
|
||||
* @param outTradeNo 商户单号
|
||||
* @param transactionId 微信支付平台订单号
|
||||
* @param outTradeNo 商户单号
|
||||
* @return 返回查询回来的结果集,支付方原值返回
|
||||
*/
|
||||
@Override
|
||||
public Map<String, Object> query(String transactionId, String outTradeNo) {
|
||||
|
||||
return query(transactionId, 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;
|
||||
@@ -366,11 +386,10 @@ public class WxPayService extends BasePayService {
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param transactionId 支付平台订单号
|
||||
* @param outTradeNo 商户单号
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @param transactionId 支付平台订单号
|
||||
* @param outTradeNo 商户单号
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @return 处理过后的类型对象,返回查询回来的结果集,支付方原值返回
|
||||
*/
|
||||
@Override
|
||||
@@ -382,46 +401,48 @@ public class WxPayService extends BasePayService {
|
||||
/**
|
||||
* 交易关闭接口
|
||||
*
|
||||
* @param transactionId 支付平台订单号
|
||||
* @param outTradeNo 商户单号
|
||||
* @param transactionId 支付平台订单号
|
||||
* @param outTradeNo 商户单号
|
||||
* @return 返回支付方交易关闭后的结果
|
||||
*/
|
||||
@Override
|
||||
public Map<String, Object> close(String transactionId, String outTradeNo) {
|
||||
|
||||
return close(transactionId, 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;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 交易关闭接口
|
||||
*
|
||||
* @param transactionId 支付平台订单号
|
||||
* @param outTradeNo 商户单号
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @param transactionId 支付平台订单号
|
||||
* @param outTradeNo 商户单号
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @return 处理过后的类型对象,返回支付方交易关闭后的结果
|
||||
*/
|
||||
@Override
|
||||
public <T> T close(String transactionId, String outTradeNo, Callback<T> callback) {
|
||||
return secondaryInterface(transactionId, outTradeNo, WxTransactionType.CLOSE, callback);
|
||||
return secondaryInterface(transactionId, outTradeNo, WxTransactionType.CLOSE, callback);
|
||||
}
|
||||
|
||||
/**
|
||||
* 退款
|
||||
*
|
||||
* @param transactionId 微信订单号
|
||||
* @param outTradeNo 商户单号
|
||||
* @param refundAmount 退款金额
|
||||
* @param totalAmount 总金额
|
||||
* @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>>() {
|
||||
return refund(transactionId, outTradeNo, refundAmount, totalAmount, new Callback<Map<String, Object>>() {
|
||||
@Override
|
||||
public Map<String, Object> perform(Map<String, Object> map) {
|
||||
return map;
|
||||
@@ -437,7 +458,7 @@ public class WxPayService extends BasePayService {
|
||||
* @param refundAmount 退款金额
|
||||
* @param totalAmount 总金额
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @param <T> 返回类型
|
||||
* @return 处理过后的类型对象, 返回支付方申请退款后的结果
|
||||
*/
|
||||
@Override
|
||||
@@ -452,8 +473,8 @@ public class WxPayService extends BasePayService {
|
||||
parameters.put("out_trade_no", outTradeNo);
|
||||
parameters.put("out_refund_no", outTradeNo);
|
||||
}
|
||||
parameters.put("total_fee", totalAmount.multiply(new BigDecimal(100)).setScale( 0, BigDecimal.ROUND_HALF_UP).intValue());
|
||||
parameters.put("refund_fee", refundAmount.multiply(new BigDecimal(100)).setScale( 0, BigDecimal.ROUND_HALF_UP).intValue());
|
||||
parameters.put("total_fee", totalAmount.multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_UP).intValue());
|
||||
parameters.put("refund_fee", refundAmount.multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_UP).intValue());
|
||||
parameters.put("op_user_id", payConfigStorage.getPid());
|
||||
|
||||
//设置签名
|
||||
@@ -464,13 +485,13 @@ public class WxPayService extends BasePayService {
|
||||
/**
|
||||
* 查询退款
|
||||
*
|
||||
* @param transactionId 支付平台订单号
|
||||
* @param outTradeNo 商户单号
|
||||
* @param transactionId 支付平台订单号
|
||||
* @param outTradeNo 商户单号
|
||||
* @return 返回支付方查询退款后的结果
|
||||
*/
|
||||
@Override
|
||||
public Map<String, Object> refundquery(String transactionId, String outTradeNo) {
|
||||
return refundquery(transactionId, outTradeNo, new Callback<Map<String, Object>>() {
|
||||
return refundquery(transactionId, outTradeNo, new Callback<Map<String, Object>>() {
|
||||
@Override
|
||||
public Map<String, Object> perform(Map<String, Object> map) {
|
||||
return map;
|
||||
@@ -481,11 +502,11 @@ public class WxPayService extends BasePayService {
|
||||
/**
|
||||
* 查询退款
|
||||
*
|
||||
* @param transactionId 支付平台订单号
|
||||
* @param outTradeNo 商户单号
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @return 处理过后的类型对象,返回支付方查询退款后的结果
|
||||
* @param transactionId 支付平台订单号
|
||||
* @param outTradeNo 商户单号
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @return 处理过后的类型对象,返回支付方查询退款后的结果
|
||||
*/
|
||||
@Override
|
||||
public <T> T refundquery(String transactionId, String outTradeNo, Callback<T> callback) {
|
||||
@@ -494,13 +515,14 @@ public class WxPayService extends BasePayService {
|
||||
|
||||
/**
|
||||
* 目前只支持日账单
|
||||
*
|
||||
* @param billDate 账单类型,商户通过接口或商户经开放平台授权后其所属服务商通过接口可以获取以下账单类型:trade、signcustomer;trade指商户基于支付宝交易收单的业务账单;signcustomer是指基于商户支付宝余额收入及支出等资金变动的帐务账单;
|
||||
* @param billType 账单时间:日账单格式为yyyy-MM-dd,月账单格式为yyyy-MM。
|
||||
* @return 返回支付方下载对账单的结果
|
||||
*/
|
||||
@Override
|
||||
public Map<String, Object> downloadbill(Date billDate, String billType) {
|
||||
return downloadbill(billDate, billType, new Callback<Map<String, Object>>() {
|
||||
return downloadbill(billDate, billType, new Callback<Map<String, Object>>() {
|
||||
@Override
|
||||
public Map<String, Object> perform(Map<String, Object> map) {
|
||||
return map;
|
||||
@@ -509,11 +531,12 @@ public class WxPayService extends BasePayService {
|
||||
}
|
||||
|
||||
/**
|
||||
* 目前只支持日账单
|
||||
* 目前只支持日账单
|
||||
*
|
||||
* @param billDate 账单时间:具体请查看对应支付平台
|
||||
* @param billType 账单类型,具体请查看对应支付平台
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @param <T> 返回类型
|
||||
* @return 处理过后的类型对象,返回支付方下载对账单的结果
|
||||
*/
|
||||
@Override
|
||||
@@ -531,26 +554,25 @@ public class WxPayService extends BasePayService {
|
||||
|
||||
//设置签名
|
||||
setSign(parameters);
|
||||
return callback.perform(requestTemplate.postForObject(getUrl(WxTransactionType.DOWNLOADBILL), XML.getMap2Xml(parameters), JSONObject.class));
|
||||
return callback.perform(requestTemplate.postForObject(getUrl(WxTransactionType.DOWNLOADBILL), XML.getMap2Xml(parameters), JSONObject.class));
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param transactionIdOrBillDate 支付平台订单号或者账单类型, 具体请 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException}
|
||||
* @param outTradeNoBillType 商户单号或者 账单类型
|
||||
* @param transactionType 交易类型
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @param outTradeNoBillType 商户单号或者 账单类型
|
||||
* @param transactionType 交易类型
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @return 返回支付方对应接口的结果
|
||||
*/
|
||||
@Override
|
||||
public <T> T secondaryInterface(Object transactionIdOrBillDate, String outTradeNoBillType, TransactionType transactionType, Callback<T> callback) {
|
||||
public <T> T secondaryInterface(Object transactionIdOrBillDate, String outTradeNoBillType, TransactionType transactionType, Callback<T> callback) {
|
||||
|
||||
if (transactionType == WxTransactionType.REFUND){
|
||||
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);
|
||||
@@ -558,13 +580,13 @@ public class WxPayService extends BasePayService {
|
||||
throw new PayErrorException(new PayException("failure", "非法类型异常:" + transactionIdOrBillDate.getClass()));
|
||||
}
|
||||
|
||||
if (!(transactionIdOrBillDate instanceof String)){
|
||||
if (!(null == transactionIdOrBillDate || transactionIdOrBillDate instanceof String)){
|
||||
throw new PayErrorException(new PayException("failure", "非法类型异常:" + transactionIdOrBillDate.getClass()));
|
||||
}
|
||||
|
||||
//获取公共参数
|
||||
Map<String, Object> parameters = getPublicParameters();
|
||||
if (null == transactionIdOrBillDate || "".equals(transactionIdOrBillDate)){
|
||||
Map<String, Object> parameters = new HashMap<>();//getPublicParameters();
|
||||
if (StringUtils.isEmpty((String)transactionIdOrBillDate)){
|
||||
parameters.put("out_trade_no", outTradeNoBillType);
|
||||
}else {
|
||||
parameters.put("transaction_id", transactionIdOrBillDate);
|
||||
@@ -575,5 +597,4 @@ public class WxPayService extends BasePayService {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user