【非常重要】:weixin4j-base->主要调整了PayPackage构造函数:从主到次

This commit is contained in:
jinyu 2015-11-23 21:30:50 +08:00
parent d3cbc3dd21
commit 0d7069036b
18 changed files with 372 additions and 200 deletions

View File

@ -495,4 +495,20 @@
* 2015-11-20 * 2015-11-20
+ weixin4j-qy:新增客服消息 + weixin4j-qy:新增客服消息
* 2015-11-23
+ weixin4j-base:PayException重命名为WeixinPayException
+ weixin4j-base:调整PayPackageV2构造函数从主到次
+ weixin4j-base:调整PayUtil2#createPayJsRequestJsonV2参数位置:从主到次
+ weixin4j-base:调整MicroPayPackage构造函数从主到次
+ weixin4j-base:调整MicroPayPackage构造函数从主到次
+ weixin4j-base:调整PayUtil#createPayJsRequestJson参数位置:从主到次
+ weixin4j-base:调整PayUtil#createNativePayRequestURL参数位置:从主到次

View File

@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>com.foxinmy</groupId> <groupId>com.foxinmy</groupId>
<artifactId>weixin4j</artifactId> <artifactId>weixin4j</artifactId>
<version>1.6.3</version> <version>1.6.4</version>
<packaging>pom</packaging> <packaging>pom</packaging>
<name>weixin4j</name> <name>weixin4j</name>
<url>https://github.com/foxinmy/weixin4j</url> <url>https://github.com/foxinmy/weixin4j</url>

View File

@ -68,4 +68,21 @@
* 2015-09-27 * 2015-09-27
+ 新增手动刷新token方法 + 新增手动刷新token方法
* 2015-11-23
+ PayException重命名为WeixinPayException
+ 调整PayPackageV2构造函数从主到次
+ 调整PayUtil2#createPayJsRequestJsonV2参数位置:从主到次
+ 调整MicroPayPackage构造函数从主到次
+ 调整MicroPayPackage构造函数从主到次
+ 调整PayUtil#createPayJsRequestJson参数位置:从主到次
+ 调整PayUtil#createNativePayRequestURL参数位置:从主到次

View File

@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.foxinmy</groupId> <groupId>com.foxinmy</groupId>
<artifactId>weixin4j</artifactId> <artifactId>weixin4j</artifactId>
<version>1.6.3</version> <version>1.6.4</version>
</parent> </parent>
<artifactId>weixin4j-base</artifactId> <artifactId>weixin4j-base</artifactId>
<name>weixin4j-base</name> <name>weixin4j-base</name>

View File

@ -3,20 +3,20 @@ package com.foxinmy.weixin4j.exception;
/** /**
* 调用微信支付抛出的异常 * 调用微信支付抛出的异常
* *
* @className PayException * @className WeixinPayException
* @author jy * @author jy
* @date 2014年10月28日 * @date 2014年10月28日
* @since JDK 1.7 * @since JDK 1.7
* @see * @see
*/ */
public class PayException extends WeixinException { public class WeixinPayException extends WeixinException {
private static final long serialVersionUID = 7148145661883468514L; private static final long serialVersionUID = 7148145661883468514L;
public PayException(String errorMsg) { public WeixinPayException(String errorMsg) {
super(errorMsg); super(errorMsg);
} }
public PayException(String errorCode, String errorMsg) { public WeixinPayException(String errorCode, String errorMsg) {
super(errorCode, errorMsg); super(errorCode, errorMsg);
} }
} }

View File

@ -59,31 +59,36 @@ public class MicroPayPackage extends PayPackage {
@XmlElement(name = "auth_code") @XmlElement(name = "auth_code")
@JSONField(name = "auth_code") @JSONField(name = "auth_code")
private String authCode; private String authCode;
/**
* 指定支付方式:no_credit--指定不能使用信用卡支付
*/
@XmlElement(name = "limit_pay")
@JSONField(name = "limit_pay")
private String limitPay;
protected MicroPayPackage() { protected MicroPayPackage() {
// jaxb required // jaxb required
} }
public MicroPayPackage(WeixinPayAccount weixinAccount, String body, public MicroPayPackage(WeixinPayAccount weixinAccount, String authCode,
String attach, String outTradeNo, double totalFee, String body, String outTradeNo, double totalFee, String createIp) {
String spbillCreateIp, String authCode) {
this(weixinAccount.getId(), weixinAccount.getMchId(), weixinAccount this(weixinAccount.getId(), weixinAccount.getMchId(), weixinAccount
.getDeviceInfo(), RandomUtil.generateString(16), body, attach, .getDeviceInfo(), authCode, body, outTradeNo, totalFee,
outTradeNo, totalFee, spbillCreateIp, null, null, null, createIp, null, null, null, null, null);
authCode);
} }
public MicroPayPackage(String appId, String mchId, String deviceInfo, public MicroPayPackage(String appId, String mchId, String deviceInfo,
String nonceStr, String body, String attach, String outTradeNo, String authCode, String body, String outTradeNo, double totalFee,
double totalFee, String spbillCreateIp, Date timeStart, String createIp, String attach, Date timeStart, Date timeExpire,
Date timeExpire, String goodsTag, String authCode) { String goodsTag, String limitPay) {
super(body, attach, outTradeNo, totalFee, spbillCreateIp, timeStart, super(body, outTradeNo, totalFee, null, createIp, null, timeStart,
timeExpire, goodsTag, null); timeExpire, goodsTag);
this.appId = appId; this.appId = appId;
this.mchId = mchId; this.mchId = mchId;
this.deviceInfo = deviceInfo; this.deviceInfo = deviceInfo;
this.nonceStr = nonceStr; this.nonceStr = RandomUtil.generateString(16);
this.authCode = authCode; this.authCode = authCode;
this.limitPay = limitPay;
} }
public String getAppId() { public String getAppId() {
@ -118,6 +123,14 @@ public class MicroPayPackage extends PayPackage {
this.authCode = authCode; this.authCode = authCode;
} }
public String getLimitPay() {
return limitPay;
}
public void setLimitPay(String limitPay) {
this.limitPay = limitPay;
}
@Override @Override
public String toString() { public String toString() {
return "MicroPayPackage [appId=" + appId + ", mchId=" + mchId return "MicroPayPackage [appId=" + appId + ", mchId=" + mchId

View File

@ -34,10 +34,6 @@ public class PayPackage implements Serializable {
* 商品详情 非必须 * 商品详情 非必须
*/ */
private String detail; private String detail;
/**
* 附加数据,原样返回 非必须
*/
private String attach;
/** /**
* 商户系统内部的订单号 ,32 个字符内 可包含字母 ,确保 在商户系统唯一 必须 * 商户系统内部的订单号 ,32 个字符内 可包含字母 ,确保 在商户系统唯一 必须
*/ */
@ -50,12 +46,22 @@ public class PayPackage implements Serializable {
@XmlElement(name = "total_fee") @XmlElement(name = "total_fee")
@JSONField(name = "total_fee") @JSONField(name = "total_fee")
private String totalFee; private String totalFee;
/**
* 通知地址接收微信支付成功通知 必须
*/
@XmlElement(name = "notify_url")
@JSONField(name = "notify_url")
private String notifyUrl;
/** /**
* 订单生成的机器 IP 必须 * 订单生成的机器 IP 必须
*/ */
@XmlElement(name = "spbill_create_ip") @XmlElement(name = "spbill_create_ip")
@JSONField(name = "spbill_create_ip") @JSONField(name = "spbill_create_ip")
private String createIp; private String createIp;
/**
* 附加数据,原样返回 非必须
*/
private String attach;
/** /**
* 订单生成时间,格式为 yyyyMMddHHmmss, 2009 12月25日9点10分10秒表示为 20091225091010时区 * 订单生成时间,格式为 yyyyMMddHHmmss, 2009 12月25日9点10分10秒表示为 20091225091010时区
* GMT+8 beijing该时间取 自商户服务器 非必须 * GMT+8 beijing该时间取 自商户服务器 非必须
@ -76,12 +82,48 @@ public class PayPackage implements Serializable {
@XmlElement(name = "goods_tag") @XmlElement(name = "goods_tag")
@JSONField(name = "goods_tag") @JSONField(name = "goods_tag")
private String goodsTag; private String goodsTag;
protected PayPackage() {
// jaxb required
}
/** /**
* 通知地址接收微信支付成功通知 必须 * 订单对象
*
* @param body
* 订单描述
* @param outTradeNo
* 商户内部ID
* @param totalFee
* 订单总额 <font color="red">单位为元</font>
* @param notifyUrl
* 回调地址
* @param createIp
* 生成订单数据的机器IP
* @param attach
* 附加数据
* @param timeStart
* 订单生成时间
* @param timeExpire
* 订单失效时间
* @param goodsTag
* 订单标记
*/ */
@XmlElement(name = "notify_url") public PayPackage(String body, String outTradeNo, double totalFee,
@JSONField(name = "notify_url") String notifyUrl, String createIp, String attach, Date timeStart,
private String notifyUrl; Date timeExpire, String goodsTag) {
this.body = body;
this.outTradeNo = outTradeNo;
this.totalFee = DateUtil.formaFee2Fen(totalFee);
this.notifyUrl = notifyUrl;
this.createIp = createIp;
this.attach = attach;
this.timeStart = timeStart != null ? DateUtil
.fortmat2yyyyMMddHHmmss(timeStart) : null;
this.timeExpire = timeExpire != null ? DateUtil
.fortmat2yyyyMMddHHmmss(timeExpire) : null;
this.goodsTag = goodsTag;
}
public String getBody() { public String getBody() {
return body; return body;
@ -99,14 +141,6 @@ public class PayPackage implements Serializable {
this.detail = detail; this.detail = detail;
} }
public String getAttach() {
return attach;
}
public void setAttach(String attach) {
this.attach = attach;
}
public String getOutTradeNo() { public String getOutTradeNo() {
return outTradeNo; return outTradeNo;
} }
@ -129,6 +163,14 @@ public class PayPackage implements Serializable {
this.totalFee = DateUtil.formaFee2Fen(totalFee); this.totalFee = DateUtil.formaFee2Fen(totalFee);
} }
public String getNotifyUrl() {
return notifyUrl;
}
public void setNotifyUrl(String notifyUrl) {
this.notifyUrl = notifyUrl;
}
public String getCreateIp() { public String getCreateIp() {
return createIp; return createIp;
} }
@ -137,6 +179,14 @@ public class PayPackage implements Serializable {
this.createIp = createIp; this.createIp = createIp;
} }
public String getAttach() {
return attach;
}
public void setAttach(String attach) {
this.attach = attach;
}
public String getTimeStart() { public String getTimeStart() {
return timeStart; return timeStart;
} }
@ -171,62 +221,12 @@ public class PayPackage implements Serializable {
this.goodsTag = goodsTag; this.goodsTag = goodsTag;
} }
public String getNotifyUrl() {
return notifyUrl;
}
public void setNotifyUrl(String notifyUrl) {
this.notifyUrl = notifyUrl;
}
protected PayPackage(){
// jaxb required
}
/**
* 订单对象
*
* @param body
* 订单描述
* @param attach
* 附加数据
* @param outTradeNo
* 商户内部ID
* @param totalFee
* 订单总额 <font color="red">单位为元</font>
* @param spbillCreateIp
* 生成订单数据的机器IP
* @param timeStart
* 订单生成时间
* @param timeExpire
* 订单失效时间
* @param goodsTag
* 订单标记
* @param notifyUrl
* 回调地址
*/
public PayPackage(String body, String attach, String outTradeNo,
double totalFee, String createIp, Date timeStart,
Date timeExpire, String goodsTag, String notifyUrl) {
this.body = body;
this.attach = attach;
this.outTradeNo = outTradeNo;
this.totalFee = DateUtil.formaFee2Fen(totalFee);
this.createIp = createIp;
this.timeStart = timeStart != null ? DateUtil
.fortmat2yyyyMMddHHmmss(timeStart) : null;
this.timeExpire = timeExpire != null ? DateUtil
.fortmat2yyyyMMddHHmmss(timeExpire) : null;
this.goodsTag = goodsTag;
this.notifyUrl = notifyUrl;
}
@Override @Override
public String toString() { public String toString() {
return "PayPackage [body=" + body + ", detail=" + detail + ", attach=" return "PayPackage [body=" + body + ", detail=" + detail
+ attach + ", outTradeNo=" + outTradeNo + ", totalFee=" + ", outTradeNo=" + outTradeNo + ", totalFee=" + totalFee
+ totalFee + ", createIp=" + createIp + ", notifyUrl=" + notifyUrl + ", createIp=" + createIp
+ ", timeStart=" + timeStart + ", timeExpire=" + timeExpire + ", attach=" + attach + ", timeStart=" + timeStart
+ ", goodsTag=" + goodsTag + ", notifyUrl=" + notifyUrl + "]"; + ", timeExpire=" + timeExpire + ", goodsTag=" + goodsTag + "]";
} }
} }

View File

@ -1,12 +1,13 @@
package com.foxinmy.weixin4j.payment; package com.foxinmy.weixin4j.payment;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference; import com.alibaba.fastjson.TypeReference;
import com.foxinmy.weixin4j.exception.PayException;
import com.foxinmy.weixin4j.exception.WeixinException; import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.exception.WeixinPayException;
import com.foxinmy.weixin4j.http.weixin.WeixinRequestExecutor; import com.foxinmy.weixin4j.http.weixin.WeixinRequestExecutor;
import com.foxinmy.weixin4j.http.weixin.WeixinResponse; import com.foxinmy.weixin4j.http.weixin.WeixinResponse;
import com.foxinmy.weixin4j.model.Consts; import com.foxinmy.weixin4j.model.Consts;
@ -64,24 +65,70 @@ public class PayUtil {
* 用户ID * 用户ID
* @param body * @param body
* 订单描述 * 订单描述
* @param orderNo * @param outTradeNo
* 订单号 * 订单号
* @param orderFee * @param totalFee
* 订单总额 按实际金额传入即可() 构造函数会转换为分 * 订单总额 按实际金额传入即可() 构造函数会转换为分
* @param notifyUrl * @param notifyUrl
* 支付通知地址 * 支付通知地址
* @param ip * @param createIp
* ip地址 * ip地址
* @param weixinAccount * @param weixinAccount
* 商户信息 * 商户信息
* @return 支付json串 * @return 支付json串
* @throws PayException * @throws WeixinPayException
*/ */
public static String createPayJsRequestJson(String openId, String body, public static String createPayJsRequestJson(String openId, String body,
String orderNo, double orderFee, String notifyUrl, String ip, String outTradeNo, double totalFee, String notifyUrl,
WeixinPayAccount weixinAccount) throws PayException { String createIp, WeixinPayAccount weixinAccount)
throws WeixinPayException {
return createPayJsRequestJson(weixinAccount, openId, body, outTradeNo,
totalFee, notifyUrl, createIp, null, null, null, null, null);
}
/**
* 生成V3.x版本JSAPI支付字符串完整参数
*
* @param weixinAccount
* 支付配置信息
* @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--指定不能使用信用卡支付
* @return 支付json串
* @throws WeixinPayException
*/
public static String createPayJsRequestJson(WeixinPayAccount weixinAccount,
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, orderNo, orderFee, notifyUrl, ip, TradeType.JSAPI); body, outTradeNo, totalFee, notifyUrl, createIp,
TradeType.JSAPI);
payPackage.setAttach(attach);
payPackage.setTimeStart(timeStart);
payPackage.setTimeExpire(timeExpire);
payPackage.setGoodsTag(goodsTag);
payPackage.setLimitPay(limitPay);
String paySignKey = weixinAccount.getPaySignKey(); String paySignKey = weixinAccount.getPaySignKey();
payPackage.setSign(paysignMd5(payPackage, paySignKey)); payPackage.setSign(paysignMd5(payPackage, paySignKey));
PrePay prePay = createPrePay(payPackage, paySignKey); PrePay prePay = createPrePay(payPackage, paySignKey);
@ -109,7 +156,7 @@ public class PayUtil {
private final static WeixinRequestExecutor httpClient = new WeixinRequestExecutor(); private final static WeixinRequestExecutor httpClient = new WeixinRequestExecutor();
public static PrePay createPrePay(MchPayPackage payPackage, public static PrePay createPrePay(MchPayPackage payPackage,
String paySignKey) throws PayException { String paySignKey) throws WeixinPayException {
if (StringUtil.isBlank(payPackage.getSign())) { if (StringUtil.isBlank(payPackage.getSign())) {
payPackage.setSign(paysignMd5(payPackage, paySignKey)); payPackage.setSign(paysignMd5(payPackage, paySignKey));
} }
@ -120,16 +167,16 @@ public class PayUtil {
PrePay prePay = response.getAsObject(new TypeReference<PrePay>() { PrePay prePay = response.getAsObject(new TypeReference<PrePay>() {
}); });
if (!prePay.getReturnCode().equalsIgnoreCase(Consts.SUCCESS)) { if (!prePay.getReturnCode().equalsIgnoreCase(Consts.SUCCESS)) {
throw new PayException(prePay.getReturnMsg(), throw new WeixinPayException(prePay.getReturnMsg(),
prePay.getReturnCode()); prePay.getReturnCode());
} }
if (!prePay.getResultCode().equalsIgnoreCase(Consts.SUCCESS)) { if (!prePay.getResultCode().equalsIgnoreCase(Consts.SUCCESS)) {
throw new PayException(prePay.getResultCode(), throw new WeixinPayException(prePay.getResultCode(),
prePay.getErrCodeDes()); prePay.getErrCodeDes());
} }
return prePay; return prePay;
} catch (WeixinException e) { } catch (WeixinException e) {
throw new PayException(e.getErrorCode(), e.getErrorMsg()); throw new WeixinPayException(e.getErrorCode(), e.getErrorMsg());
} }
} }
@ -200,7 +247,7 @@ public class PayUtil {
} }
/** /**
* 创建V3.x NativePay支付(扫码支付)链接模式二 * 创建V3.x NativePay支付(扫码支付)链接模式二必填参数
* *
* @param weixinAccount * @param weixinAccount
* 支付配置信息 * 支付配置信息
@ -220,15 +267,63 @@ public class PayUtil {
* @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 PayException * @throws WeixinPayException
*/ */
public static String createNativePayRequestURL( public static String createNativePayRequestURL(
WeixinPayAccount weixinAccount, String productId, String body, WeixinPayAccount weixinAccount, String productId, String body,
String outTradeNo, double totalFee, String notifyUrl, String outTradeNo, double totalFee, String notifyUrl,
String createIp) throws PayException { String createIp) throws WeixinPayException {
return createNativePayRequestURL(weixinAccount, productId, body,
outTradeNo, totalFee, notifyUrl, createIp, null, null, null,
null, null);
}
/**
* 创建V3.x NativePay支付(扫码支付)链接模式二完整参数
*
* @param weixinAccount
* 支付配置信息
* @param productId
* 商品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--指定不能使用信用卡支付
* @return 支付链接
* @see <a href="http://pay.weixin.qq.com/wiki/doc/api/native.php">扫码支付</a>
* @see <a
* href="https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5">模式二</a>
* @throws WeixinPayException
*/
public static String createNativePayRequestURL(
WeixinPayAccount weixinAccount, String productId, 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, null, body, MchPayPackage payPackage = new MchPayPackage(weixinAccount, null, body,
outTradeNo, totalFee, notifyUrl, createIp, TradeType.NATIVE); outTradeNo, totalFee, notifyUrl, createIp, TradeType.NATIVE);
payPackage.setProductId(productId); payPackage.setProductId(productId);
payPackage.setAttach(attach);
payPackage.setTimeStart(timeStart);
payPackage.setTimeExpire(timeExpire);
payPackage.setGoodsTag(goodsTag);
payPackage.setLimitPay(limitPay);
String paySignKey = weixinAccount.getPaySignKey(); String paySignKey = weixinAccount.getPaySignKey();
payPackage.setSign(paysignMd5(payPackage, paySignKey)); payPackage.setSign(paysignMd5(payPackage, paySignKey));
PrePay prePay = createPrePay(payPackage, paySignKey); PrePay prePay = createPrePay(payPackage, paySignKey);
@ -242,13 +337,11 @@ public class PayUtil {
* 扫码支付授权码 ,设备读取用户微信中的条码或者二维码信息 * 扫码支付授权码 ,设备读取用户微信中的条码或者二维码信息
* @param body * @param body
* 商品描述 * 商品描述
* @param attach
* 附加数据
* @param orderNo * @param orderNo
* 商户内部唯一订单号 * 商户内部唯一订单号
* @param orderFee * @param orderFee
* 商品总额 单位元 * 商品总额 单位元
* @param ip * @param createIp
* 订单生成的机器 IP * 订单生成的机器 IP
* @param weixinAccount * @param weixinAccount
* 商户信息 * 商户信息
@ -257,10 +350,10 @@ public class PayUtil {
* @throws WeixinException * @throws WeixinException
*/ */
public static Order createMicroPay(String authCode, String body, public static Order createMicroPay(String authCode, String body,
String attach, String orderNo, double orderFee, String createIp, String orderNo, double orderFee, String createIp,
WeixinPayAccount weixinAccount) throws WeixinException { WeixinPayAccount weixinAccount) throws WeixinException {
MicroPayPackage payPackage = new MicroPayPackage(weixinAccount, body, MicroPayPackage payPackage = new MicroPayPackage(weixinAccount,
attach, orderNo, orderFee, createIp, authCode); authCode, body, orderNo, orderFee, createIp);
return createMicroPay(payPackage, weixinAccount); return createMicroPay(payPackage, weixinAccount);
} }
@ -289,7 +382,7 @@ public class PayUtil {
}); });
} }
private static String JSAPI() throws PayException { private static String JSAPI() throws WeixinPayException {
WeixinPayAccount weixinAccount = JSON.parseObject( WeixinPayAccount weixinAccount = JSON.parseObject(
Weixin4jConfigUtil.getValue("account"), WeixinPayAccount.class); Weixin4jConfigUtil.getValue("account"), WeixinPayAccount.class);
return createPayJsRequestJson("oyFLst1bqtuTcxK-ojF8hOGtLQao", "支付测试", return createPayJsRequestJson("oyFLst1bqtuTcxK-ojF8hOGtLQao", "支付测试",
@ -303,7 +396,7 @@ public class PayUtil {
return createNativePayRequestURL(weixinAccount, "P1"); return createNativePayRequestURL(weixinAccount, "P1");
} }
public static void main(String[] args) throws PayException { public static void main(String[] args) throws WeixinPayException {
// V3版本下的JS支付 // V3版本下的JS支付
System.out.println(JSAPI()); System.out.println(JSAPI());
// V3版本下的原生支付 // V3版本下的原生支付

View File

@ -74,6 +74,12 @@ public class MchPayPackage extends PayPackage {
@XmlElement(name = "product_id") @XmlElement(name = "product_id")
@JSONField(name = "product_id") @JSONField(name = "product_id")
private String productId; private String productId;
/**
* 指定支付方式:no_credit--指定不能使用信用卡支付
*/
@XmlElement(name = "limit_pay")
@JSONField(name = "limit_pay")
private String limitPay;
protected MchPayPackage() { protected MchPayPackage() {
// jaxb required // jaxb required
@ -81,34 +87,35 @@ public class MchPayPackage extends PayPackage {
public MchPayPackage(WeixinPayAccount weixinAccount, String openId, public MchPayPackage(WeixinPayAccount weixinAccount, String openId,
String body, String outTradeNo, double totalFee, String notifyUrl, String body, String outTradeNo, double totalFee, String notifyUrl,
String spbillCreateIp, TradeType tradeType) { String createIp, TradeType tradeType) {
this(weixinAccount, openId, body, null, outTradeNo, totalFee, this(weixinAccount, openId, body, outTradeNo, totalFee, notifyUrl,
notifyUrl, spbillCreateIp, tradeType); createIp, tradeType, null);
} }
public MchPayPackage(WeixinPayAccount weixinAccount, String openId, public MchPayPackage(WeixinPayAccount weixinAccount, String openId,
String body, String attach, String outTradeNo, double totalFee, String body, String outTradeNo, double totalFee, String notifyUrl,
String notifyUrl, String spbillCreateIp, TradeType tradeType) { String createIp, TradeType tradeType, String attach) {
this(weixinAccount.getId(), weixinAccount.getMchId(), weixinAccount this(weixinAccount.getId(), weixinAccount.getMchId(), weixinAccount
.getDeviceInfo(), RandomUtil.generateString(16), body, attach, .getDeviceInfo(), body, outTradeNo, totalFee, notifyUrl,
outTradeNo, totalFee, spbillCreateIp, null, null, null, createIp, tradeType, openId, attach, null, null, null, null,
notifyUrl, tradeType, openId, null); null);
} }
public MchPayPackage(String appId, String mchId, String deviceInfo, public MchPayPackage(String appId, String mchId, String deviceInfo,
String nonceStr, String body, String attach, String outTradeNo, String body, String outTradeNo, double totalFee, String notifyUrl,
double totalFee, String spbillCreateIp, Date timeStart, String createIp, TradeType tradeType, String openId, String attach,
Date timeExpire, String goodsTag, String notifyUrl, Date timeStart, Date timeExpire, String goodsTag, String productId,
TradeType tradeType, String openId, String productId) { String limitPay) {
super(body, attach, outTradeNo, totalFee, spbillCreateIp, timeStart, super(body, outTradeNo, totalFee, notifyUrl, createIp, attach,
timeExpire, goodsTag, notifyUrl); timeStart, timeExpire, goodsTag);
this.appId = appId; this.appId = appId;
this.mchId = mchId; this.mchId = mchId;
this.deviceInfo = deviceInfo; this.deviceInfo = deviceInfo;
this.nonceStr = nonceStr; this.nonceStr = RandomUtil.generateString(16);
this.tradeType = tradeType.name(); this.tradeType = tradeType.name();
this.openId = openId; this.openId = openId;
this.productId = productId; this.productId = productId;
this.limitPay = limitPay;
} }
public String getAppId() { public String getAppId() {
@ -151,6 +158,14 @@ public class MchPayPackage extends PayPackage {
this.productId = productId; this.productId = productId;
} }
public String getLimitPay() {
return limitPay;
}
public void setLimitPay(String limitPay) {
this.limitPay = limitPay;
}
@Override @Override
public String toString() { public String toString() {
return "MchPayPackage [appId=" + appId + ", mchId=" + mchId return "MchPayPackage [appId=" + appId + ", mchId=" + mchId

View File

@ -4,7 +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.XmlRootElement; import javax.xml.bind.annotation.XmlRootElement;
import com.foxinmy.weixin4j.exception.PayException; import com.foxinmy.weixin4j.exception.WeixinPayException;
import com.foxinmy.weixin4j.payment.PayRequest; import com.foxinmy.weixin4j.payment.PayRequest;
/** /**
@ -34,7 +34,7 @@ public class MchPayRequest extends PayRequest {
// jaxb required // jaxb required
} }
public MchPayRequest(PrePay prePay) throws PayException { public MchPayRequest(PrePay prePay) throws WeixinPayException {
this.setAppId(prePay.getAppId()); this.setAppId(prePay.getAppId());
this.setPackageInfo("prepay_id=" + prePay.getPrepayId()); this.setPackageInfo("prepay_id=" + prePay.getPrepayId());
} }

View File

@ -6,7 +6,7 @@ import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlTransient;
import com.alibaba.fastjson.annotation.JSONField; import com.alibaba.fastjson.annotation.JSONField;
import com.foxinmy.weixin4j.exception.PayException; import com.foxinmy.weixin4j.exception.WeixinPayException;
import com.foxinmy.weixin4j.model.Consts; import com.foxinmy.weixin4j.model.Consts;
import com.foxinmy.weixin4j.payment.PayUtil; import com.foxinmy.weixin4j.payment.PayUtil;
import com.foxinmy.weixin4j.util.RandomUtil; import com.foxinmy.weixin4j.util.RandomUtil;
@ -44,7 +44,7 @@ public class NativePayResponse extends ApiResult {
* 失败消息 * 失败消息
* @param resultMsg * @param resultMsg
* 结果消息 * 结果消息
* @throws PayException * @throws WeixinPayException
*/ */
public NativePayResponse(String returnMsg, String resultMsg) { public NativePayResponse(String returnMsg, String resultMsg) {
super.setReturnMsg(returnMsg); super.setReturnMsg(returnMsg);
@ -58,10 +58,10 @@ public class NativePayResponse extends ApiResult {
* *
* @param payPackage * @param payPackage
* 订单信息 * 订单信息
* @throws PayException * @throws WeixinPayException
*/ */
public NativePayResponse(MchPayPackage payPackage, String paysignKey) public NativePayResponse(MchPayPackage payPackage, String paysignKey)
throws PayException { throws WeixinPayException {
super.setReturnCode(Consts.SUCCESS); super.setReturnCode(Consts.SUCCESS);
this.setResultCode(Consts.SUCCESS); this.setResultCode(Consts.SUCCESS);
this.setMchId(payPackage.getMchId()); this.setMchId(payPackage.getMchId());

View File

@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.foxinmy</groupId> <groupId>com.foxinmy</groupId>
<artifactId>weixin4j</artifactId> <artifactId>weixin4j</artifactId>
<version>1.6.3</version> <version>1.6.4</version>
</parent> </parent>
<artifactId>weixin4j-mp</artifactId> <artifactId>weixin4j-mp</artifactId>
<name>weixin4j-mp</name> <name>weixin4j-mp</name>

View File

@ -65,33 +65,22 @@ public class PayPackageV2 extends PayPackage {
// jaxb required // jaxb required
} }
public PayPackageV2(String outTradeNo, double totalFee, public PayPackageV2(String partner, String body, String outTradeNo,
String spbillCreateIp) { double totalFee, String notifyUrl, String createIp) {
this(null, null, null, outTradeNo, totalFee, null, spbillCreateIp, this(partner, body, outTradeNo, totalFee, notifyUrl, createIp, null,
null, null, 0d, 0d, null); null, null, 0d, 0d, null);
} }
public PayPackageV2(String body, String outTradeNo, double totalFee, public PayPackageV2(String partner, String body, String outTradeNo,
String notifyUrl, String spbillCreateIp) { double totalFee, String notifyUrl, String createIp, String attach,
this(body, null, null, outTradeNo, totalFee, notifyUrl, spbillCreateIp, Date timeStart, Date timeExpire, double transportFee,
null, null, 0d, 0d, null); double productFee, String goodsTag) {
} super(body, outTradeNo, totalFee, notifyUrl, createIp, attach,
timeStart, timeExpire, goodsTag);
public PayPackageV2(String body, String partner, String outTradeNo,
double totalFee, String notifyUrl, String spbillCreateIp) {
this(body, null, partner, outTradeNo, totalFee, notifyUrl,
spbillCreateIp, null, null, 0d, 0d, null);
}
public PayPackageV2(String body, String attach, String partner,
String outTradeNo, double totalFee, String notifyUrl,
String spbillCreateIp, Date timeStart, Date timeExpire,
double transportFee, double productFee, String goodsTag) {
super(body, attach, outTradeNo, totalFee, spbillCreateIp, timeStart,
timeExpire, goodsTag, notifyUrl);
this.bankType = "WX"; this.bankType = "WX";
this.feeType = "1"; this.feeType = "1";
this.inputCharset = "UTF-8"; this.inputCharset = "UTF-8";
this.partner = partner;
this.transportFee = transportFee > 0d ? DateUtil this.transportFee = transportFee > 0d ? DateUtil
.formaFee2Fen(transportFee) : null; .formaFee2Fen(transportFee) : null;
this.productFee = productFee > 0 ? DateUtil.formaFee2Fen(productFee) this.productFee = productFee > 0 ? DateUtil.formaFee2Fen(productFee)

View File

@ -1,18 +1,18 @@
package com.foxinmy.weixin4j.mp.payment.v2; package com.foxinmy.weixin4j.mp.payment.v2;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.foxinmy.weixin4j.exception.PayException; import com.foxinmy.weixin4j.exception.WeixinPayException;
import com.foxinmy.weixin4j.model.WeixinPayAccount; import com.foxinmy.weixin4j.model.WeixinPayAccount;
import com.foxinmy.weixin4j.type.SignType; import com.foxinmy.weixin4j.type.SignType;
import com.foxinmy.weixin4j.util.Weixin4jConfigUtil;
import com.foxinmy.weixin4j.util.DateUtil; import com.foxinmy.weixin4j.util.DateUtil;
import com.foxinmy.weixin4j.util.DigestUtil; import com.foxinmy.weixin4j.util.DigestUtil;
import com.foxinmy.weixin4j.util.MapUtil; import com.foxinmy.weixin4j.util.MapUtil;
import com.foxinmy.weixin4j.util.RandomUtil; import com.foxinmy.weixin4j.util.RandomUtil;
import com.foxinmy.weixin4j.util.StringUtil; import com.foxinmy.weixin4j.util.Weixin4jConfigUtil;
import com.foxinmy.weixin4j.xml.XmlStream; import com.foxinmy.weixin4j.xml.XmlStream;
/** /**
@ -25,49 +25,80 @@ import com.foxinmy.weixin4j.xml.XmlStream;
* @see * @see
*/ */
public class PayUtil2 { public class PayUtil2 {
/**
* 生成V2.x版本JSAPI支付字符串
*
* @param payPackage
* 订单信息
* @param weixinAccount
* 商户信息
* @return 支付json串
*/
public static String createPayJsRequestJsonV2(PayPackageV2 payPackage,
WeixinPayAccount weixinAccount) {
if (StringUtil.isBlank(payPackage.getPartner())) {
payPackage.setPartner(weixinAccount.getPartnerId());
}
JsPayRequestV2 jsPayRequest = new JsPayRequestV2(weixinAccount,
payPackage);
jsPayRequest.setPaySign(paysignSha(jsPayRequest,
weixinAccount.getPaySignKey()));
jsPayRequest.setSignType(SignType.SHA1);
return JSON.toJSONString(jsPayRequest);
}
/** /**
* 生成V2.x版本JSAPI支付字符串 * 生成V2.x版本JSAPI支付字符串
* *
* @param body * @param body
* 支付详情 * 支付详情
* @param orderNo * @param outTradeNo
* 订单号 * 订单号
* @param orderFee * @param totalFee
* 订单总额 按实际金额传入即可() 构造函数会转换为分 * 订单总额 按实际金额传入即可() 构造函数会转换为分
* @param ip * @param notifyUrl
* 支付回调URL
* @param createIp
* 订单生成的机器 IP
* @param weixinAccount * @param weixinAccount
* 商户信息 * 商户信息
* @return 支付json串 * @return 支付json串
*/ */
public static String createPayJsRequestJsonV2(String body, String orderNo, public static String createPayJsRequestJsonV2(String body,
double orderFee, String notify_url, String ip, String outTradeNo, double totalFee, String notifyUrl,
WeixinPayAccount weixinAccount) { String createIp, WeixinPayAccount weixinAccount) {
PayPackageV2 payPackage = new PayPackageV2(body, orderNo, orderFee, return createPayJsRequestJsonV2(weixinAccount, body, outTradeNo,
notify_url, ip); totalFee, notifyUrl, createIp, null, null, null, 0d, 0d, null);
payPackage.setPartner(weixinAccount.getPartnerId()); }
return createPayJsRequestJsonV2(payPackage, weixinAccount);
/**
* 生成V2.x版本JSAPI支付字符串
*
* @param weixinAccount
* 商户信息
* @param body
* 支付详情
* @param outTradeNo
* 订单号
* @param totalFee
* 订单总额 按实际金额传入即可() 构造函数会转换为分
* @param notifyUrl
* 支付回调URL
* @param createIp
* 订单生成的机器 IP
* @param attach
* 附加数据在查询API和支付通知中原样返回该字段主要用于商户携带订单的自定义数据
* @param timeStart
* 订单生成时间格式为yyyyMMddHHmmss
* @param timeExpire
* 订单失效时间格式为yyyyMMddHHmmss;注意最短失效时间间隔必须大于5分钟
* @param transportFee
* 物流费用 如有值 必须保证 transportFee+productFee=totalFee
* @param transportFee
* 商品费用 如有值 必须保证 transportFee+productFee=totalFee
* @param goodsTag
* 商品标记代金券或立减优惠功能的参数
* @return 支付json串
*/
public static String createPayJsRequestJsonV2(
WeixinPayAccount weixinAccount, String body, String outTradeNo,
double totalFee, String notifyUrl, String createIp, String attach,
Date timeStart, Date timeExpire, double transportFee,
double productFee, String goodsTag) {
PayPackageV2 payPackage = new PayPackageV2(
weixinAccount.getPartnerId(), body, outTradeNo, totalFee,
notifyUrl, createIp);
payPackage.setAttach(attach);
payPackage.setTimeStart(timeStart);
payPackage.setTimeExpire(timeExpire);
payPackage.setTransportFee(transportFee);
payPackage.setProductFee(productFee);
payPackage.setGoodsTag(goodsTag);
JsPayRequestV2 jsPayRequest = new JsPayRequestV2(weixinAccount,
payPackage);
jsPayRequest.setPaySign(paysignSha(jsPayRequest,
weixinAccount.getPaySignKey()));
jsPayRequest.setSignType(SignType.SHA1);
return JSON.toJSONString(jsPayRequest);
} }
/** /**
@ -163,7 +194,7 @@ public class PayUtil2 {
return createNativePayRequestURLV2(weixinAccount, "P1"); return createNativePayRequestURLV2(weixinAccount, "P1");
} }
public static void main(String[] args) throws PayException { public static void main(String[] args) throws WeixinPayException {
// V2版本下的JS支付 // V2版本下的JS支付
System.out.println(JSAPIV2()); System.out.println(JSAPIV2());
// V2版本下的原生支付 // V2版本下的原生支付

View File

@ -9,7 +9,7 @@ import java.util.Date;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import com.foxinmy.weixin4j.exception.PayException; import com.foxinmy.weixin4j.exception.WeixinPayException;
import com.foxinmy.weixin4j.exception.WeixinException; import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.http.weixin.XmlResult; import com.foxinmy.weixin4j.http.weixin.XmlResult;
import com.foxinmy.weixin4j.model.WeixinPayAccount; import com.foxinmy.weixin4j.model.WeixinPayAccount;
@ -143,7 +143,7 @@ public class PayTest {
try { try {
prePay = PayUtil.createPrePay(payPackageV3, prePay = PayUtil.createPrePay(payPackageV3,
ACCOUNT3.getPaySignKey()); ACCOUNT3.getPaySignKey());
} catch (PayException e) { } catch (WeixinPayException e) {
e.printStackTrace(); e.printStackTrace();
} }
System.err.println(prePay); System.err.println(prePay);

View File

@ -29,7 +29,7 @@ public class UserTest extends TokenTest {
@Test @Test
public void getUser() throws WeixinException { public void getUser() throws WeixinException {
User user = userApi.getUser("owGBft_vbBbOaQOmpEUE4xDLeRSU"); User user = userApi.getUser("o9Onds6fbeK0lDwD8lJt2PY1VRys");
Assert.assertNotNull(user); Assert.assertNotNull(user);
System.out.println(user); System.out.println(user);
// following(); // following();

View File

@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.foxinmy</groupId> <groupId>com.foxinmy</groupId>
<artifactId>weixin4j</artifactId> <artifactId>weixin4j</artifactId>
<version>1.6.3</version> <version>1.6.4</version>
</parent> </parent>
<artifactId>weixin4j-qy</artifactId> <artifactId>weixin4j-qy</artifactId>
<name>weixin4j-qy</name> <name>weixin4j-qy</name>

View File

@ -31,13 +31,11 @@ public class AesToken implements Serializable {
/** /**
* 一般为明文模式 * 一般为明文模式
* *
* @param weixinId
* 微信号(原始ID/appid/corpid)
* @param token * @param token
* 开发者的Token * 开发者的Token
*/ */
public AesToken(String weixinId, String token) { public AesToken(String token) {
this(weixinId, token, null); this(null, token, null);
} }
/** /**