weixin4j-base:MchPayRequest抽象化

This commit is contained in:
jinyu 2015-12-26 16:58:34 +08:00
parent 4f0382e726
commit 763b1a66b9
13 changed files with 446 additions and 247 deletions

View File

@ -596,4 +596,9 @@
+ weixin4j-qy:新增企业号联系人筛选配置类(JSSDKContactConfigurator) + weixin4j-qy:新增企业号联系人筛选配置类(JSSDKContactConfigurator)
+ weixin4j-server:DigestUtil 重命名为 DigestUtils + weixin4j-server:DigestUtil 重命名为 DigestUtils
* 2015-12-26
+ weixin4j-base:MchPayRequest抽象化

View File

@ -9,7 +9,7 @@ weixin4j
------- -------
* **weixin4j-base** * **weixin4j-base**
`微信支付(刷卡/扫码/公众号/现金红包/企业付款)` `微信支付(刷卡/扫码/JS/APP/WAP/现金红包/企业付款)`
* **weixin4j-mp** * **weixin4j-mp**

View File

@ -27,19 +27,22 @@ import com.foxinmy.weixin4j.model.Consts;
import com.foxinmy.weixin4j.model.WeixinPayAccount; import com.foxinmy.weixin4j.model.WeixinPayAccount;
import com.foxinmy.weixin4j.payment.MicroPayPackage; import com.foxinmy.weixin4j.payment.MicroPayPackage;
import com.foxinmy.weixin4j.payment.PayURLConsts; import com.foxinmy.weixin4j.payment.PayURLConsts;
import com.foxinmy.weixin4j.payment.mch.APPPayRequest;
import com.foxinmy.weixin4j.payment.mch.ApiResult; import com.foxinmy.weixin4j.payment.mch.ApiResult;
import com.foxinmy.weixin4j.payment.mch.AuthCodeOpenIdResult; import com.foxinmy.weixin4j.payment.mch.AuthCodeOpenIdResult;
import com.foxinmy.weixin4j.payment.mch.JSAPIPayRequest;
import com.foxinmy.weixin4j.payment.mch.MchPayPackage; import com.foxinmy.weixin4j.payment.mch.MchPayPackage;
import com.foxinmy.weixin4j.payment.mch.MchPayRequest; import com.foxinmy.weixin4j.payment.mch.MchPayRequest;
import com.foxinmy.weixin4j.payment.mch.NATIVEPayRequest;
import com.foxinmy.weixin4j.payment.mch.Order; import com.foxinmy.weixin4j.payment.mch.Order;
import com.foxinmy.weixin4j.payment.mch.PrePay; import com.foxinmy.weixin4j.payment.mch.PrePay;
import com.foxinmy.weixin4j.payment.mch.RefundRecord; import com.foxinmy.weixin4j.payment.mch.RefundRecord;
import com.foxinmy.weixin4j.payment.mch.RefundResult; import com.foxinmy.weixin4j.payment.mch.RefundResult;
import com.foxinmy.weixin4j.payment.mch.WAPPayRequest;
import com.foxinmy.weixin4j.type.BillType; import com.foxinmy.weixin4j.type.BillType;
import com.foxinmy.weixin4j.type.CurrencyType; import com.foxinmy.weixin4j.type.CurrencyType;
import com.foxinmy.weixin4j.type.IdQuery; import com.foxinmy.weixin4j.type.IdQuery;
import com.foxinmy.weixin4j.type.IdType; import com.foxinmy.weixin4j.type.IdType;
import com.foxinmy.weixin4j.type.SignType;
import com.foxinmy.weixin4j.type.TradeType; import com.foxinmy.weixin4j.type.TradeType;
import com.foxinmy.weixin4j.util.DateUtil; import com.foxinmy.weixin4j.util.DateUtil;
import com.foxinmy.weixin4j.util.DigestUtil; import com.foxinmy.weixin4j.util.DigestUtil;
@ -109,7 +112,40 @@ public class Pay3Api {
} }
/** /**
* 生成V3.x版本JSAPI支付请求对象 * 创建支付请求对象
*
* @param payPackage
* 支付详情
* @return 支付请求对象
* @see com.foxinmy.weixin4j.payment.mch.JSAPIPayRequest JS支付
* @see com.foxinmy.weixin4j.payment.mch.NATIVEPayRequest 扫码支付
* @see com.foxinmy.weixin4j.payment.mch.APPPayRequest APP支付
* @see com.foxinmy.weixin4j.payment.mch.WAPPayRequest WAP支付
* @throws WeixinPayException
*/
public MchPayRequest createPayRequest(MchPayPackage payPackage)
throws WeixinPayException {
payPackage.setSign(DigestUtil.paysignMd5(payPackage,
weixinAccount.getPaySignKey()));
PrePay prePay = createPrePay(payPackage);
String tradeType = payPackage.getTradeType();
if (TradeType.APP.name().equalsIgnoreCase(tradeType)) {
return new APPPayRequest(prePay, weixinAccount);
} else if (TradeType.JSAPI.name().equalsIgnoreCase(tradeType)) {
return new JSAPIPayRequest(prePay, weixinAccount);
} else if (TradeType.NATIVE.name().equalsIgnoreCase(tradeType)) {
return new NATIVEPayRequest(prePay, weixinAccount);
} else if (TradeType.WAP.name().equalsIgnoreCase(tradeType)) {
return new WAPPayRequest(prePay, weixinAccount);
} else if (TradeType.MICROPAY.name().equalsIgnoreCase(tradeType)) {
throw new WeixinPayException("maybe use createMicroPay method?");
} else {
throw new WeixinPayException("unknown tradeType:" + tradeType);
}
}
/**
* 创建JSAPI支付请求对象
* *
* @param openId * @param openId
* 用户ID * 用户ID
@ -123,74 +159,21 @@ public class Pay3Api {
* 支付通知地址 * 支付通知地址
* @param createIp * @param createIp
* ip地址 * ip地址
* @see com.foxinmy.weixin4j.payment.mch.MchPayRequest * @see com.foxinmy.weixin4j.payment.mch.JSAPIPayRequest
* @return MchPayRequest对象<font * @return JSAPI支付对象
* color="red">注意如果要转换为JSON格式请使用fastjson中的JSON
* #toJSONString方法或直接用MchPayRequest#asPayJsRequestJson方法</font>
* @throws WeixinPayException * @throws WeixinPayException
*/ */
public MchPayRequest createPayJsRequest(String openId, String body, public MchPayRequest createJsPayRequest(String openId, String body,
String outTradeNo, double totalFee, String notifyUrl, String outTradeNo, double totalFee, String notifyUrl,
String createIp) throws WeixinPayException { String createIp) throws WeixinPayException {
return createPayJsRequest(openId, body, outTradeNo, totalFee,
notifyUrl, createIp, null, null, null, null, null);
}
/**
* 生成V3.x版本JSAPI支付请求对象完整参数
*
* @param openId
* 用户ID
* @param body
* 商品描述
* @param outTradeNo
* 商户内部唯一订单号
* @param totalFee
* 商品总额 单位元
* @param notifyUrl
* 支付回调URL
* @param createIp
* 订单生成的机器 IP
* @param attach
* 附加数据在查询API和支付通知中原样返回该字段主要用于商户携带订单的自定义数据
* @param timeStart
* 订单生成时间格式为yyyyMMddHHmmss
* @param timeExpire
* 订单失效时间格式为yyyyMMddHHmmss;注意最短失效时间间隔必须大于5分钟
* @param goodsTag
* 商品标记代金券或立减优惠功能的参数
* @param limitPay
* 指定支付方式:no_credit--指定不能使用信用卡支付
* @see com.foxinmy.weixin4j.payment.mch.MchPayRequest
* @return MchPayRequest对象<font
* color="red">注意如果要转换为JSON格式请使用fastjson中的JSON对象或者直接用MchPayRequest#
* asPayJsRequestJson方法</font>
* @throws WeixinPayException
*/
public MchPayRequest createPayJsRequest(String openId, String body,
String outTradeNo, double totalFee, String notifyUrl,
String createIp, String attach, Date timeStart, Date timeExpire,
String goodsTag, String limitPay) throws WeixinPayException {
MchPayPackage payPackage = new MchPayPackage(weixinAccount, openId, MchPayPackage payPackage = new MchPayPackage(weixinAccount, openId,
body, outTradeNo, totalFee, notifyUrl, createIp, body, outTradeNo, totalFee, notifyUrl, createIp,
TradeType.JSAPI); TradeType.JSAPI);
payPackage.setAttach(attach); return createPayRequest(payPackage);
payPackage.setTimeStart(timeStart);
payPackage.setTimeExpire(timeExpire);
payPackage.setGoodsTag(goodsTag);
payPackage.setLimitPay(limitPay);
payPackage.setSign(DigestUtil.paysignMd5(payPackage,
weixinAccount.getPaySignKey()));
PrePay prePay = createPrePay(payPackage);
MchPayRequest jsPayRequest = new MchPayRequest(prePay);
jsPayRequest.setSignType(SignType.MD5);
jsPayRequest.setPaySign(DigestUtil.paysignMd5(jsPayRequest,
weixinAccount.getPaySignKey()));
return jsPayRequest;
} }
/** /**
* 创建V3.x NativePay支付(扫码支付)链接模式一 * 创建Native支付(扫码支付)链接模式一
* *
* @param productId * @param productId
* 与订单ID等价 * 与订单ID等价
@ -215,7 +198,7 @@ public class Pay3Api {
} }
/** /**
* 创建V3.x NativePay支付(扫码支付)链接模式二必填参数 * 创建Native支付(扫码支付)链接模式二
* *
* @param productId * @param productId
* 商品ID * 商品ID
@ -229,24 +212,24 @@ public class Pay3Api {
* 支付回调URL * 支付回调URL
* @param createIp * @param createIp
* 订单生成的机器 IP * 订单生成的机器 IP
* @return 支付链接 * @return Native支付对象
* @see com.foxinmy.weixin4j.payment.mch.NATIVEPayRequest
* @see <a href="http://pay.weixin.qq.com/wiki/doc/api/native.php">扫码支付</a> * @see <a href="http://pay.weixin.qq.com/wiki/doc/api/native.php">扫码支付</a>
* @see <a * @see <a
* href="https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5">模式二</a> * href="https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5">模式二</a>
* @throws WeixinPayException * @throws WeixinPayException
*/ */
public String createNativePayRequestURL(String productId, String body, public MchPayRequest createNativePayRequest(String productId, String body,
String outTradeNo, double totalFee, String notifyUrl, String outTradeNo, double totalFee, String notifyUrl,
String createIp) throws WeixinPayException { String createIp) throws WeixinPayException {
return createNativePayRequestURL(productId, body, outTradeNo, totalFee, MchPayPackage payPackage = new MchPayPackage(weixinAccount, null, body,
notifyUrl, createIp, null, null, null, null, null); outTradeNo, totalFee, notifyUrl, createIp, TradeType.NATIVE);
return createPayRequest(payPackage);
} }
/** /**
* 创建V3.x Native支付(扫码支付)链接模式二完整参数 * 创建APP支付请求对象
* *
* @param productId
* 商品ID
* @param body * @param body
* 商品描述 * 商品描述
* @param outTradeNo * @param outTradeNo
@ -257,38 +240,45 @@ public class Pay3Api {
* 支付回调URL * 支付回调URL
* @param createIp * @param createIp
* 订单生成的机器 IP * 订单生成的机器 IP
* @param attach * @return APP支付对象
* 附加数据在查询API和支付通知中原样返回该字段主要用于商户携带订单的自定义数据 * @see com.foxinmy.weixin4j.payment.mch.APPPayRequest
* @param timeStart
* 订单生成时间格式为yyyyMMddHHmmss
* @param timeExpire
* 订单失效时间格式为yyyyMMddHHmmss;注意最短失效时间间隔必须大于5分钟
* @param goodsTag
* 商品标记代金券或立减优惠功能的参数
* @param limitPay
* 指定支付方式:no_credit--指定不能使用信用卡支付
* @return 支付链接
* @see <a href="http://pay.weixin.qq.com/wiki/doc/api/native.php">扫码支付</a>
* @see <a * @see <a
* href="https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5">模式二</a> * href="https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_1">APP支付</a>
* @throws WeixinPayException * @throws WeixinPayException
*/ */
public String createNativePayRequestURL(String productId, String body, public MchPayRequest createAppPayRequest(String body, String outTradeNo,
String outTradeNo, double totalFee, String notifyUrl, double totalFee, String notifyUrl, String createIp)
String createIp, String attach, Date timeStart, Date timeExpire, throws WeixinPayException {
String goodsTag, String limitPay) throws WeixinPayException {
MchPayPackage payPackage = new MchPayPackage(weixinAccount, null, body, MchPayPackage payPackage = new MchPayPackage(weixinAccount, null, body,
outTradeNo, totalFee, notifyUrl, createIp, TradeType.NATIVE); outTradeNo, totalFee, notifyUrl, createIp, TradeType.APP);
payPackage.setProductId(productId); return createPayRequest(payPackage);
payPackage.setAttach(attach); }
payPackage.setTimeStart(timeStart);
payPackage.setTimeExpire(timeExpire); /**
payPackage.setGoodsTag(goodsTag); * 创建WAP支付请求对象
payPackage.setLimitPay(limitPay); *
payPackage.setSign(DigestUtil.paysignMd5(payPackage, * @param body
weixinAccount.getPaySignKey())); * 商品描述
PrePay prePay = createPrePay(payPackage); * @param outTradeNo
return prePay.getCodeUrl(); * 商户内部唯一订单号
* @param totalFee
* 商品总额 单位元
* @param notifyUrl
* 支付回调URL
* @param createIp
* 订单生成的机器 IP
* @return WAP支付对象
* @see com.foxinmy.weixin4j.payment.mch.WAPPayRequest
* @see <a
* href="https://pay.weixin.qq.com/wiki/doc/api/wap.php?chapter=15_1">WAP支付</a>
* @throws WeixinPayException
*/
public MchPayRequest createWAPPayRequest(String body, String outTradeNo,
double totalFee, String notifyUrl, String createIp)
throws WeixinPayException {
MchPayPackage payPackage = new MchPayPackage(weixinAccount, null, body,
outTradeNo, totalFee, notifyUrl, createIp, TradeType.WAP);
return createPayRequest(payPackage);
} }
/** /**

View File

@ -4,6 +4,7 @@ import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import com.alibaba.fastjson.annotation.JSONField; import com.alibaba.fastjson.annotation.JSONField;
import com.foxinmy.weixin4j.util.DateUtil; import com.foxinmy.weixin4j.util.DateUtil;
@ -22,6 +23,19 @@ public class PayRequest extends PayBaseInfo {
@JSONField(name = "package") @JSONField(name = "package")
private String packageInfo; private String packageInfo;
/**
* 冗余字段
*/
@XmlTransient
@JSONField(serialize = false)
private String prepayId;
/**
* 冗余字段
*/
@XmlTransient
@JSONField(serialize = false)
private String partnerId;
public PayRequest() { public PayRequest() {
super(null, DateUtil.timestamp2string(), RandomUtil.generateString(16)); super(null, DateUtil.timestamp2string(), RandomUtil.generateString(16));
} }
@ -39,6 +53,22 @@ public class PayRequest extends PayBaseInfo {
this.packageInfo = packageInfo; this.packageInfo = packageInfo;
} }
public String getPrepayId() {
return prepayId;
}
public void setPrepayId(String prepayId) {
this.prepayId = prepayId;
}
public String getPartnerId() {
return partnerId;
}
public void setPartnerId(String partnerId) {
this.partnerId = partnerId;
}
@Override @Override
public String toString() { public String toString() {
return "package" + packageInfo + ", " + super.toString(); return "package" + packageInfo + ", " + super.toString();

View File

@ -113,12 +113,19 @@ public final class PayURLConsts {
*/ */
public static final String MCH_NATIVE_URL = "weixin://wxpay/bizpayurl?sign=%s&appid=%s&mch_id=%s&product_id=%s&time_stamp=%s&nonce_str=%s"; public static final String MCH_NATIVE_URL = "weixin://wxpay/bizpayurl?sign=%s&appid=%s&mch_id=%s&product_id=%s&time_stamp=%s&nonce_str=%s";
/**
* WAP支付
*
* @see <a
* href="https://pay.weixin.qq.com/wiki/doc/api/wap.php?chapter=15_1">WAP支付说明</a>
*/
public static final String MCH_WAP_URL = "weixin://wap/pay?%s";
/** /**
* 授权码查询OPENID接口 * 授权码查询OPENID接口
*/ */
public static final String MCH_AUTHCODE_OPENID_URL = MCH_BASE_URL public static final String MCH_AUTHCODE_OPENID_URL = MCH_BASE_URL
+ "/tools/authcodetoopenid"; + "/tools/authcodetoopenid";
/** /**
* <p> * <p>
* 生成编辑地址请求 * 生成编辑地址请求

View File

@ -66,7 +66,6 @@ public class WeixinPayProxy {
* *
* @param weixinAccount * @param weixinAccount
* 支付相关的公众号账号信息 * 支付相关的公众号账号信息
*
*/ */
public WeixinPayProxy(WeixinPayAccount weixinAccount) { public WeixinPayProxy(WeixinPayAccount weixinAccount) {
this.weixinAccount = weixinAccount; this.weixinAccount = weixinAccount;
@ -106,7 +105,25 @@ public class WeixinPayProxy {
} }
/** /**
* 生成JSAPI支付请求对象 * 创建支付请求对象
*
* @param payPackage
* 支付详情
* @return 支付请求对象
* @see com.foxinmy.weixin4j.api.Pay3Api
* @see com.foxinmy.weixin4j.payment.mch.JSAPIPayRequest JS支付
* @see com.foxinmy.weixin4j.payment.mch.NATIVEPayRequest 扫码支付
* @see com.foxinmy.weixin4j.payment.mch.APPPayRequest APP支付
* @see com.foxinmy.weixin4j.payment.mch.WAPPayRequest WAP支付
* @throws WeixinPayException
*/
public MchPayRequest createPayRequest(MchPayPackage payPackage)
throws WeixinPayException {
return pay3Api.createPayRequest(payPackage);
}
/**
* 创建JSAPI支付请求对象
* *
* @param openId * @param openId
* 用户ID * 用户ID
@ -120,61 +137,18 @@ public class WeixinPayProxy {
* 支付通知地址 * 支付通知地址
* @param createIp * @param createIp
* ip地址 * ip地址
* @return MchPayRequest对象<font
* color="red">注意如果要转换为JSON格式请使用fastjson中的JSON
* #toJSONString方法或直接用MchPayRequest#asPayJsRequestJson方法</font>
* @see com.foxinmy.weixin4j.api.Pay3Api * @see com.foxinmy.weixin4j.api.Pay3Api
* @see com.foxinmy.weixin4j.payment.mch.MchPayRequest * @see com.foxinmy.weixin4j.payment.mch.JSAPIPayRequest
* @return JSAPI支付对象
* @throws WeixinPayException * @throws WeixinPayException
*/ */
public MchPayRequest createPayJsRequest(String openId, String body, public MchPayRequest createJsPayRequest(String openId, String body,
String outTradeNo, double totalFee, String notifyUrl, String outTradeNo, double totalFee, String notifyUrl,
String createIp) throws WeixinPayException { String createIp) throws WeixinPayException {
return pay3Api.createPayJsRequest(openId, body, outTradeNo, totalFee, return pay3Api.createJsPayRequest(openId, body, outTradeNo, totalFee,
notifyUrl, createIp); notifyUrl, createIp);
} }
/**
* 生成JSAPI支付请求对象完整参数
*
* @param openId
* 用户ID
* @param body
* 商品描述
* @param outTradeNo
* 商户内部唯一订单号
* @param totalFee
* 商品总额 单位元
* @param notifyUrl
* 支付回调URL
* @param createIp
* 订单生成的机器 IP
* @param attach
* 附加数据在查询API和支付通知中原样返回该字段主要用于商户携带订单的自定义数据
* @param timeStart
* 订单生成时间格式为yyyyMMddHHmmss
* @param timeExpire
* 订单失效时间格式为yyyyMMddHHmmss;注意最短失效时间间隔必须大于5分钟
* @param goodsTag
* 商品标记代金券或立减优惠功能的参数
* @param limitPay
* 指定支付方式:no_credit--指定不能使用信用卡支付
* @see com.foxinmy.weixin4j.api.Pay3Api
* @see com.foxinmy.weixin4j.payment.mch.MchPayRequest
* @return MchPayRequest对象<font
* color="red">注意如果要转换为JSON格式请使用fastjson中的JSON
* #toJSONString方法或直接用MchPayRequest#asPayJsRequestJson方法</font>
* @throws WeixinPayException
*/
public MchPayRequest createPayJsRequest(String openId, String body,
String outTradeNo, double totalFee, String notifyUrl,
String createIp, String attach, Date timeStart, Date timeExpire,
String goodsTag, String limitPay) throws WeixinPayException {
return pay3Api.createPayJsRequest(openId, body, outTradeNo, totalFee,
notifyUrl, createIp, attach, timeStart, timeExpire, goodsTag,
limitPay);
}
/** /**
* 创建Native支付(扫码支付)链接模式一 * 创建Native支付(扫码支付)链接模式一
* *
@ -191,7 +165,7 @@ public class WeixinPayProxy {
} }
/** /**
* 创建V3.x NativePay支付(扫码支付)链接模式二必填参数 * 创建Native支付(扫码支付)链接模式二
* *
* @param productId * @param productId
* 商品ID * 商品ID
@ -205,25 +179,24 @@ public class WeixinPayProxy {
* 支付回调URL * 支付回调URL
* @param createIp * @param createIp
* 订单生成的机器 IP * 订单生成的机器 IP
* @return 支付链接 * @return Native支付对象
* @see com.foxinmy.weixin4j.api.Pay3Api * @see com.foxinmy.weixin4j.api.Pay3Api
* @see com.foxinmy.weixin4j.payment.mch.NATIVEPayRequest
* @see <a href="http://pay.weixin.qq.com/wiki/doc/api/native.php">扫码支付</a> * @see <a href="http://pay.weixin.qq.com/wiki/doc/api/native.php">扫码支付</a>
* @see <a * @see <a
* href="https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5">模式二</a> * href="https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5">模式二</a>
* @throws WeixinPayException * @throws WeixinPayException
*/ */
public String createNativePayRequestURL(String productId, String body, public MchPayRequest createNativePayRequest(String productId, String body,
String outTradeNo, double totalFee, String notifyUrl, String outTradeNo, double totalFee, String notifyUrl,
String createIp) throws WeixinPayException { String createIp) throws WeixinPayException {
return pay3Api.createNativePayRequestURL(productId, body, outTradeNo, return pay3Api.createNativePayRequest(productId, body, outTradeNo,
totalFee, notifyUrl, createIp); totalFee, notifyUrl, createIp);
} }
/** /**
* 创建Native支付(扫码支付)链接模式二完整参数 * 创建APP支付请求对象
* *
* @param productId
* 商品ID
* @param body * @param body
* 商品描述 * 商品描述
* @param outTradeNo * @param outTradeNo
@ -234,30 +207,45 @@ public class WeixinPayProxy {
* 支付回调URL * 支付回调URL
* @param createIp * @param createIp
* 订单生成的机器 IP * 订单生成的机器 IP
* @param attach * @return APP支付对象
* 附加数据在查询API和支付通知中原样返回该字段主要用于商户携带订单的自定义数据
* @param timeStart
* 订单生成时间格式为yyyyMMddHHmmss
* @param timeExpire
* 订单失效时间格式为yyyyMMddHHmmss;注意最短失效时间间隔必须大于5分钟
* @param goodsTag
* 商品标记代金券或立减优惠功能的参数
* @param limitPay
* 指定支付方式:no_credit--指定不能使用信用卡支付
* @return 支付链接
* @see com.foxinmy.weixin4j.api.Pay3Api * @see com.foxinmy.weixin4j.api.Pay3Api
* @see <a href="http://pay.weixin.qq.com/wiki/doc/api/native.php">扫码支付</a> * @see com.foxinmy.weixin4j.payment.mch.APPPayRequest
* @see <a * @see <a
* href="https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5">模式二</a> * href="https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_1">APP支付</a>
* @throws WeixinPayException * @throws WeixinPayException
*/ */
public String createNativePayRequestURL(String productId, String body, public MchPayRequest createAppPayRequest(String body, String outTradeNo,
String outTradeNo, double totalFee, String notifyUrl, double totalFee, String notifyUrl, String createIp)
String createIp, String attach, Date timeStart, Date timeExpire, throws WeixinPayException {
String goodsTag, String limitPay) throws WeixinPayException { return pay3Api.createAppPayRequest(body, outTradeNo, totalFee,
return pay3Api.createNativePayRequestURL(productId, body, outTradeNo, notifyUrl, createIp);
totalFee, notifyUrl, createIp, attach, timeStart, timeExpire, }
goodsTag, limitPay);
/**
* 创建WAP支付请求对象
*
* @param body
* 商品描述
* @param outTradeNo
* 商户内部唯一订单号
* @param totalFee
* 商品总额 单位元
* @param notifyUrl
* 支付回调URL
* @param createIp
* 订单生成的机器 IP
* @return WAP支付对象
* @see com.foxinmy.weixin4j.api.Pay3Api
* @see com.foxinmy.weixin4j.payment.mch.WAPPayRequest
* @see <a
* href="https://pay.weixin.qq.com/wiki/doc/api/wap.php?chapter=15_1">WAP支付</a>
* @throws WeixinPayException
*/
public MchPayRequest createWAPPayRequest(String body, String outTradeNo,
double totalFee, String notifyUrl, String createIp)
throws WeixinPayException {
return pay3Api.createWAPPayRequest(body, outTradeNo, totalFee,
notifyUrl, createIp);
} }
/** /**

View File

@ -0,0 +1,63 @@
package com.foxinmy.weixin4j.payment.mch;
import com.foxinmy.weixin4j.model.WeixinPayAccount;
import com.foxinmy.weixin4j.payment.PayRequest;
import com.foxinmy.weixin4j.util.DigestUtil;
import com.foxinmy.weixin4j.util.MapUtil;
/**
* APP支付
*
* @className APPPayRequest
* @author jy
* @date 2015年12月25日
* @since JDK 1.6
* @see com.foxinmy.weixin4j.payment.mch.PrePay
* @see com.foxinmy.weixin4j.payment.PayRequest
* @see <a
* href="https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_1">APP支付</a>
*/
public class APPPayRequest extends AbstractPayRequest {
public APPPayRequest(PrePay prePay, WeixinPayAccount payAccount) {
super(prePay, payAccount);
}
/**
* <font color="red">只做查看之用,请不要尝试作为支付请求</font>
*/
@Override
public PayRequest toRequestObject() {
PayRequest payRequest = new PayRequest(getPayAccount().getId(),
"Sign=WXPay");
payRequest.setPrepayId(getPrePay().getPrepayId());
payRequest.setPartnerId(getPayAccount().getPartnerId());
return payRequest;
}
@Override
public String toRequestString() {
PayRequest payRequest = toRequestObject();
String sign = DigestUtil.MD5(
String.format("%s&key=%s",
MapUtil.toJoinString(payRequest, false, true, null),
getPayAccount().getPaySignKey())).toUpperCase();
StringBuilder content = new StringBuilder();
content.append("<xml>");
content.append(String.format("<appid><![CDATA[%s]]></appid>",
payRequest.getAppId()));
content.append(String.format("<partnerid><![CDATA[%s]]></partnerid>",
payRequest.getPartnerId()));
content.append(String.format("<prepayid><![CDATA[%s]]></prepayid>",
payRequest.getPrepayId()));
content.append(String.format("<package><![CDATA[%s]]></package>",
payRequest.getPackageInfo()));
content.append(String.format("<noncestr><![CDATA[%s]]></noncestr>",
payRequest.getNonceStr()));
content.append(String.format("<timestamp><![CDATA[%s]]></timestamp>",
payRequest.getTimeStamp()));
content.append(String.format("<sign><![CDATA[%s]]></sign>", sign));
content.append("</xml>");
return content.toString();
}
}

View File

@ -0,0 +1,30 @@
package com.foxinmy.weixin4j.payment.mch;
import com.alibaba.fastjson.JSON;
import com.foxinmy.weixin4j.model.WeixinPayAccount;
public abstract class AbstractPayRequest implements MchPayRequest {
private final PrePay prePay;
private final WeixinPayAccount payAccount;
public AbstractPayRequest(PrePay prePay, WeixinPayAccount payAccount) {
this.prePay = prePay;
this.payAccount = payAccount;
}
@Override
public PrePay getPrePay() {
return this.prePay;
}
@Override
public WeixinPayAccount getPayAccount() {
return this.payAccount;
}
@Override
public String toRequestString() {
return JSON.toJSONString(toRequestObject());
}
}

View File

@ -0,0 +1,40 @@
package com.foxinmy.weixin4j.payment.mch;
import com.foxinmy.weixin4j.model.WeixinPayAccount;
import com.foxinmy.weixin4j.payment.PayRequest;
import com.foxinmy.weixin4j.type.SignType;
import com.foxinmy.weixin4j.util.DigestUtil;
/**
* 公众号JS支付:get_brand_wcpay_request</br>
* <p>
* get_brand_wcpay_request:ok 支付成功<br>
* get_brand_wcpay_request:cancel 支付过程中用户取消<br>
* get_brand_wcpay_request:fail 支付失败
* </p>
*
* @className JSAPIPayRequest
* @author jy
* @date 2015年12月25日
* @since JDK 1.6
* @see com.foxinmy.weixin4j.payment.mch.PrePay
* @see com.foxinmy.weixin4j.payment.PayRequest
* @see <a
* href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6">网页端调起支付API</a>
*/
public class JSAPIPayRequest extends AbstractPayRequest {
public JSAPIPayRequest(PrePay prePay, WeixinPayAccount payAccount) {
super(prePay, payAccount);
}
@Override
public PayRequest toRequestObject() {
PayRequest payRequest = new PayRequest(getPayAccount().getId(),
"prepay_id=" + getPrePay().getPrepayId());
payRequest.setSignType(SignType.MD5);
payRequest.setPaySign(DigestUtil.paysignMd5(payRequest, getPayAccount()
.getPaySignKey()));
return payRequest;
}
}

View File

@ -1,91 +1,46 @@
package com.foxinmy.weixin4j.payment.mch; package com.foxinmy.weixin4j.payment.mch;
import javax.xml.bind.annotation.XmlAccessType; import com.foxinmy.weixin4j.model.WeixinPayAccount;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONField;
import com.foxinmy.weixin4j.payment.PayRequest; import com.foxinmy.weixin4j.payment.PayRequest;
import com.foxinmy.weixin4j.type.SignType;
import com.foxinmy.weixin4j.util.DigestUtil;
/** /**
* JS支付:get_brand_wcpay_request</br> * 支付请求接口
* <p>
* get_brand_wcpay_request:ok 支付成功<br>
* get_brand_wcpay_request:cancel 支付过程中用户取消<br>
* get_brand_wcpay_request:fail 支付失败
* </p>
* <p>
* NATIVE支付:PayRequest.TradeType=NATIVE
* </p>
* *
* @className MchPayRequest * @className MchPayRequest
* @author jy * @author jy
* @date 2014年8月17日 * @date 2015年12月25日
* @since JDK 1.6 * @since JDK 1.7
* @see com.foxinmy.weixin4j.payment.mch.PrePay * @see JSAPIPayRequest JS支付
* @see NATIVEPayRequest 扫码支付
* @see APPPayRequest APP支付
* @see WAPPayRequest WAP支付
*/ */
@XmlRootElement public interface MchPayRequest {
@XmlAccessorType(XmlAccessType.FIELD) /**
public class MchPayRequest extends PayRequest { * 预支付对象
*
private static final long serialVersionUID = -5972173459255255197L; * @return
*/
@XmlTransient public PrePay getPrePay();
@JSONField(serialize = false)
private PrePay prePay;
protected MchPayRequest() {
// jaxb required
}
public MchPayRequest(PrePay prePay) {
super(prePay.getAppId(), "prepay_id=" + prePay.getPrepayId());
this.prePay = prePay;
}
public MchPayRequest(String appId, String prepayId) {
super(appId, "prepay_id=" + prepayId);
this.prePay = new PrePay();
this.prePay.setAppId(appId);
this.prePay.setPrepayId(prepayId);
}
public PrePay getPrePay() {
return prePay;
}
/** /**
* 针对未签名的 MchPayRequest * 商户信息
* *
* @param paySignKey * @return
* 支付签名密钥
* @return JSAPI支付JSON串
*/ */
@XmlTransient public WeixinPayAccount getPayAccount();
@JSONField(serialize = false)
public String asPayJsRequestJson(String paySignKey) {
this.setSignType(SignType.MD5);
this.setPaySign(DigestUtil.paysignMd5(this, paySignKey));
return asPayJsRequestJson();
}
/** /**
* 针对已签名的 MchPayRequest * 支付请求字符串
* *
* @return JSAPI支付JSON串 * @return
*/ */
@XmlTransient public String toRequestString();
@JSONField(serialize = false)
public String asPayJsRequestJson() {
return JSON.toJSONString(this);
}
@Override /**
public String toString() { * 支付请求对象
return "MchPayRequest [" + super.toString() + "]"; *
} * @return
*/
public PayRequest toRequestObject();
} }

View File

@ -0,0 +1,37 @@
package com.foxinmy.weixin4j.payment.mch;
import com.foxinmy.weixin4j.model.WeixinPayAccount;
import com.foxinmy.weixin4j.payment.PayRequest;
/**
* NATIVE扫码支付(模式二)
*
* @className NATIVEPayRequest
* @author jy
* @date 2015年12月25日
* @since JDK 1.6
* @see com.foxinmy.weixin4j.payment.mch.PrePay
* @see com.foxinmy.weixin4j.payment.PayRequest
* @see <a
* href="https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5">NATIVE扫码支付(模式二)</a>
*/
public class NATIVEPayRequest extends AbstractPayRequest {
public NATIVEPayRequest(PrePay prePay, WeixinPayAccount payAccount) {
super(prePay, payAccount);
}
/**
* <font color="red">只做查看之用,请不要尝试作为支付请求</font>
*/
@Override
public PayRequest toRequestObject() {
return new PayRequest(getPayAccount().getId(), "code_url="
+ getPrePay().getCodeUrl());
}
@Override
public String toRequestString() {
return getPrePay().getCodeUrl();
}
}

View File

@ -0,0 +1,50 @@
package com.foxinmy.weixin4j.payment.mch;
import com.foxinmy.weixin4j.model.Consts;
import com.foxinmy.weixin4j.model.WeixinPayAccount;
import com.foxinmy.weixin4j.payment.PayRequest;
import com.foxinmy.weixin4j.payment.PayURLConsts;
import com.foxinmy.weixin4j.util.DigestUtil;
import com.foxinmy.weixin4j.util.MapUtil;
import com.foxinmy.weixin4j.util.URLEncodingUtil;
/**
* WAP支付
*
* @className WAPPayRequest
* @author jy
* @date 2015年12月25日
* @since JDK 1.6
* @see com.foxinmy.weixin4j.payment.mch.PrePay
* @see com.foxinmy.weixin4j.payment.PayRequest
* @see <a
* href="https://pay.weixin.qq.com/wiki/doc/api/wap.php?chapter=15_1">WAP支付</a>
*/
public class WAPPayRequest extends AbstractPayRequest {
public WAPPayRequest(PrePay prePay, WeixinPayAccount payAccount) {
super(prePay, payAccount);
}
/**
* <font color="red">只做查看之用,请不要尝试作为支付请求</font>
*/
@Override
public PayRequest toRequestObject() {
PayRequest payRequest = new PayRequest(getPayAccount().getId(), "WAP");
payRequest.setPrepayId(getPrePay().getPrepayId());
return payRequest;
}
@Override
public String toRequestString() {
PayRequest payRequest = toRequestObject();
String original = MapUtil.toJoinString(payRequest, true, true, null);
String sign = DigestUtil.MD5(
String.format("%s&key=%s", original, getPayAccount()
.getPaySignKey())).toUpperCase();
return String.format(PayURLConsts.MCH_WAP_URL, URLEncodingUtil
.encoding(String.format("%s&sign=%s", original, sign),
Consts.UTF_8, true));
}
}

View File

@ -25,5 +25,9 @@ public enum TradeType {
/** /**
* APP支付 * APP支付
*/ */
APP; APP,
/**
* WAP支付
*/
WAP;
} }