增加注释。

This commit is contained in:
egzosn
2017-10-26 18:44:29 +08:00
parent a7f9719057
commit 1401334d9e
20 changed files with 219 additions and 156 deletions

View File

@@ -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,7 +65,7 @@
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) 所提交的安卓例子或者分支

View File

@@ -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", "账单类型");

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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();

View File

@@ -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;
@@ -144,6 +145,7 @@ public class PayMessageRouter {
if(rule.isAsync()) {
futures.add(
executorService.submit(new Runnable() {
@Override
public void run() {
rule.service(payMessage, payService, exceptionHandler);
}

View File

@@ -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

View File

@@ -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();

View File

@@ -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);
}

View File

@@ -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

View File

@@ -23,7 +23,9 @@ public class ApyAccountService {
@Resource
private AutowireCapableBeanFactory spring;
//缓存
/**
* 缓存
*/
private final static Map<Integer, PayResponse> payResponses = new HashMap<Integer, PayResponse>();
/**

View File

@@ -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)

View File

@@ -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

View File

@@ -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 () {

View File

@@ -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

View File

@@ -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;

View File

@@ -33,13 +33,21 @@ import java.util.concurrent.locks.Lock;
*/
public class WxYouDianPayService extends BasePayService {
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";
@@ -310,14 +318,16 @@ public class WxYouDianPayService extends BasePayService {
/**
* 具体需要返回的数据为
*return_code 返回码只有SUCCESS和FAIL
*return_msg 返回具体信息
*nonce_str 您的服务器新生成随机生成32位字符串
*sign 为签名,签名规则是您需要发送的所有数据(除了sign)按照字典升序排列后加上&amp;key=xxxxxxxx您的密钥后md5加密最后转成小写
*最后把得到的所有需要返回的数据用json格式化成json对象格式如下
*{&quot;return_code&quot;:&quot;SUCCESS&quot;,&quot;return_msg&quot;:&quot;ok&quot;,&quot;nonce_str&quot;:&quot;dddddddddddddddddddd,sign:sdddddddddddddddddd&quot;}
* @param code return_code
* return_code 返回码只有SUCCESS和FAIL
* return_msg 返回具体信息
* nonce_str 您的服务器新生成随机生成32位字符串
* sign 为签名,签名规则是您需要发送的所有数据(除了sign)按照字典升序排列后加上&amp;key=xxxxxxxx您的密钥后md5加密最后转成小写
* 最后把得到的所有需要返回的数据用json格式化成json对象格式如下
* {&quot;return_code&quot;:&quot;SUCCESS&quot;,&quot;return_msg&quot;:&quot;ok&quot;,&quot;nonce_str&quot;:&quot;dddddddddddddddddddd,sign:sdddddddddddddddddd&quot;}
*
* @param code return_code
* @param message return_msg
*
* @return 返回输出消息
*/
@Override

View File

@@ -11,9 +11,13 @@ import com.egzosn.pay.common.bean.TransactionType;
*/
public enum YoudianTransactionType implements TransactionType {
//扫码付
/**
* 扫码付
*/
NATIVE("unifiedorder"),
//刷卡付
/**
* 刷卡付
*/
MICROPAY("micropay");//暂未接触
private String method;

View File

@@ -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", "账单类型");

View File

@@ -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;