支付方法中的证书文件参数由File调整为InputStream

This commit is contained in:
jinyu 2015-07-08 09:02:17 +08:00
parent 7fe0b7b055
commit 7be1a45403
10 changed files with 116 additions and 147 deletions

View File

@ -1,7 +1,5 @@
package com.foxinmy.weixin4j.api; package com.foxinmy.weixin4j.api;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.HashMap; import java.util.HashMap;
@ -48,7 +46,7 @@ public class CashApi {
/** /**
* 发放红包 企业向微信用户个人发现金红包 * 发放红包 企业向微信用户个人发现金红包
* *
* @param caFile * @param ca
* 证书文件(V3版本后缀为*.p12) * 证书文件(V3版本后缀为*.p12)
* @param redpacket * @param redpacket
* 红包信息 * 红包信息
@ -59,7 +57,7 @@ public class CashApi {
* href="http://pay.weixin.qq.com/wiki/doc/api/cash_coupon.php?chapter=13_5">发放红包接口说明</a> * href="http://pay.weixin.qq.com/wiki/doc/api/cash_coupon.php?chapter=13_5">发放红包接口说明</a>
* @throws WeixinException * @throws WeixinException
*/ */
public RedpacketSendResult sendRedpack(File caFile, Redpacket redpacket) public RedpacketSendResult sendRedpack(InputStream ca, Redpacket redpacket)
throws WeixinException { throws WeixinException {
JSONObject obj = (JSONObject) JSON.toJSON(redpacket); JSONObject obj = (JSONObject) JSON.toJSON(redpacket);
obj.put("nonce_str", RandomUtil.generateString(16)); obj.put("nonce_str", RandomUtil.generateString(16));
@ -70,16 +68,10 @@ public class CashApi {
obj.put("sign", sign); obj.put("sign", sign);
String param = XmlStream.map2xml(obj); String param = XmlStream.map2xml(obj);
WeixinResponse response = null; WeixinResponse response = null;
InputStream ca = null;
try { try {
ca = new FileInputStream(caFile);
SSLHttpClinet request = new SSLHttpClinet(weixinAccount.getMchId(), SSLHttpClinet request = new SSLHttpClinet(weixinAccount.getMchId(),
ca); ca);
response = request.post(PayURLConsts.MCH_REDPACKSEND_URL, param); response = request.post(PayURLConsts.MCH_REDPACKSEND_URL, param);
} catch (WeixinException e) {
throw e;
} catch (IOException e) {
throw new WeixinException(e.getMessage());
} finally { } finally {
if (ca != null) { if (ca != null) {
try { try {
@ -96,7 +88,7 @@ public class CashApi {
/** /**
* 查询红包记录 * 查询红包记录
* *
* @param caFile * @param ca
* 证书文件(V3版本后缀为*.p12) * 证书文件(V3版本后缀为*.p12)
* @param outTradeNo * @param outTradeNo
* 商户发放红包的商户订单号 * 商户发放红包的商户订单号
@ -106,7 +98,7 @@ public class CashApi {
* href="http://pay.weixin.qq.com/wiki/doc/api/cash_coupon.php?chapter=13_6">查询红包接口说明</a> * href="http://pay.weixin.qq.com/wiki/doc/api/cash_coupon.php?chapter=13_6">查询红包接口说明</a>
* @throws WeixinException * @throws WeixinException
*/ */
public RedpacketRecord queryRedpack(File caFile, String outTradeNo) public RedpacketRecord queryRedpack(InputStream ca, String outTradeNo)
throws WeixinException { throws WeixinException {
Map<String, String> para = new HashMap<String, String>(); Map<String, String> para = new HashMap<String, String>();
para.put("nonce_str", RandomUtil.generateString(16)); para.put("nonce_str", RandomUtil.generateString(16));
@ -118,16 +110,10 @@ public class CashApi {
para.put("sign", sign); para.put("sign", sign);
String param = XmlStream.map2xml(para); String param = XmlStream.map2xml(para);
WeixinResponse response = null; WeixinResponse response = null;
InputStream ca = null;
try { try {
ca = new FileInputStream(caFile);
SSLHttpClinet request = new SSLHttpClinet(weixinAccount.getMchId(), SSLHttpClinet request = new SSLHttpClinet(weixinAccount.getMchId(),
ca); ca);
response = request.post(PayURLConsts.MCH_REDPACKQUERY_URL, param); response = request.post(PayURLConsts.MCH_REDPACKQUERY_URL, param);
} catch (WeixinException e) {
throw e;
} catch (IOException e) {
throw new WeixinException(e.getMessage());
} finally { } finally {
if (ca != null) { if (ca != null) {
try { try {
@ -144,7 +130,7 @@ public class CashApi {
/** /**
* 企业付款 实现企业向个人付款针对部分有开发能力的商户 提供通过API完成企业付款的功能 比如目前的保险行业向客户退保给付理赔 * 企业付款 实现企业向个人付款针对部分有开发能力的商户 提供通过API完成企业付款的功能 比如目前的保险行业向客户退保给付理赔
* *
* @param caFile * @param ca
* 证书文件(V3版本后缀为*.p12) * 证书文件(V3版本后缀为*.p12)
* @param mpPayment * @param mpPayment
* 付款信息 * 付款信息
@ -155,7 +141,7 @@ public class CashApi {
* href="http://pay.weixin.qq.com/wiki/doc/api/mch_pay.php?chapter=14_1">企业付款</a> * href="http://pay.weixin.qq.com/wiki/doc/api/mch_pay.php?chapter=14_1">企业付款</a>
* @throws WeixinException * @throws WeixinException
*/ */
public MPPaymentResult mchPayment(File caFile, MPPayment mpPayment) public MPPaymentResult mchPayment(InputStream ca, MPPayment mpPayment)
throws WeixinException { throws WeixinException {
JSONObject obj = (JSONObject) JSON.toJSON(mpPayment); JSONObject obj = (JSONObject) JSON.toJSON(mpPayment);
obj.put("nonce_str", RandomUtil.generateString(16)); obj.put("nonce_str", RandomUtil.generateString(16));
@ -167,16 +153,10 @@ public class CashApi {
obj.put("sign", sign); obj.put("sign", sign);
String param = XmlStream.map2xml(obj); String param = XmlStream.map2xml(obj);
WeixinResponse response = null; WeixinResponse response = null;
InputStream ca = null;
try { try {
ca = new FileInputStream(caFile);
SSLHttpClinet request = new SSLHttpClinet(weixinAccount.getMchId(), SSLHttpClinet request = new SSLHttpClinet(weixinAccount.getMchId(),
ca); ca);
response = request.post(PayURLConsts.MCH_ENPAYMENT_URL, param); response = request.post(PayURLConsts.MCH_ENPAYMENT_URL, param);
} catch (WeixinException e) {
throw e;
} catch (IOException e) {
throw new WeixinException(e.getMessage());
} finally { } finally {
if (ca != null) { if (ca != null) {
try { try {
@ -197,7 +177,7 @@ public class CashApi {
/** /**
* 企业付款查询 用于商户的企业付款操作进行结果查询返回付款操作详细结果 * 企业付款查询 用于商户的企业付款操作进行结果查询返回付款操作详细结果
* *
* @param caFile * @param ca
* 证书文件(V3版本后缀为*.p12) * 证书文件(V3版本后缀为*.p12)
* @param outTradeNo * @param outTradeNo
* 商户调用企业付款API时使用的商户订单号 * 商户调用企业付款API时使用的商户订单号
@ -207,7 +187,7 @@ public class CashApi {
* href="http://pay.weixin.qq.com/wiki/doc/api/mch_pay.php?chapter=14_3">企业付款查询</a> * href="http://pay.weixin.qq.com/wiki/doc/api/mch_pay.php?chapter=14_3">企业付款查询</a>
* @throws WeixinException * @throws WeixinException
*/ */
public MPPaymentRecord mchPaymentQuery(File caFile, String outTradeNo) public MPPaymentRecord mchPaymentQuery(InputStream ca, String outTradeNo)
throws WeixinException { throws WeixinException {
JSONObject obj = new JSONObject(); JSONObject obj = new JSONObject();
obj.put("nonce_str", RandomUtil.generateString(16)); obj.put("nonce_str", RandomUtil.generateString(16));
@ -218,16 +198,10 @@ public class CashApi {
obj.put("sign", sign); obj.put("sign", sign);
String param = XmlStream.map2xml(obj); String param = XmlStream.map2xml(obj);
WeixinResponse response = null; WeixinResponse response = null;
InputStream ca = null;
try { try {
ca = new FileInputStream(caFile);
SSLHttpClinet request = new SSLHttpClinet(weixinAccount.getMchId(), SSLHttpClinet request = new SSLHttpClinet(weixinAccount.getMchId(),
ca); ca);
response = request.post(PayURLConsts.MCH_ENPAYQUERY_URL, param); response = request.post(PayURLConsts.MCH_ENPAYQUERY_URL, param);
} catch (WeixinException e) {
throw e;
} catch (IOException e) {
throw new WeixinException(e.getMessage());
} finally { } finally {
if (ca != null) { if (ca != null) {
try { try {

View File

@ -1,7 +1,5 @@
package com.foxinmy.weixin4j.api; package com.foxinmy.weixin4j.api;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.HashMap; import java.util.HashMap;
@ -45,7 +43,7 @@ public class CouponApi {
/** /**
* 发放代金券(需要证书) * 发放代金券(需要证书)
* *
* @param caFile * @param ca
* 证书文件(后缀为*.p12) * 证书文件(后缀为*.p12)
* @param couponStockId * @param couponStockId
* 代金券批次id * 代金券批次id
@ -61,7 +59,7 @@ public class CouponApi {
* href="http://pay.weixin.qq.com/wiki/doc/api/sp_coupon.php?chapter=12_3">发放代金券接口</a> * href="http://pay.weixin.qq.com/wiki/doc/api/sp_coupon.php?chapter=12_3">发放代金券接口</a>
* @throws WeixinException * @throws WeixinException
*/ */
public CouponResult sendCoupon(File caFile, String couponStockId, public CouponResult sendCoupon(InputStream ca, String couponStockId,
String partnerTradeNo, String openId, String opUserId) String partnerTradeNo, String openId, String opUserId)
throws WeixinException { throws WeixinException {
Map<String, String> map = baseMap(); Map<String, String> map = baseMap();
@ -81,16 +79,10 @@ public class CouponApi {
map.put("sign", sign); map.put("sign", sign);
String param = XmlStream.map2xml(map); String param = XmlStream.map2xml(map);
WeixinResponse response = null; WeixinResponse response = null;
InputStream ca = null;
try { try {
ca = new FileInputStream(caFile);
SSLHttpClinet request = new SSLHttpClinet(weixinAccount.getMchId(), SSLHttpClinet request = new SSLHttpClinet(weixinAccount.getMchId(),
ca); ca);
response = request.post(PayURLConsts.MCH_COUPONSEND_URL, param); response = request.post(PayURLConsts.MCH_COUPONSEND_URL, param);
} catch (WeixinException e) {
throw e;
} catch (IOException e) {
throw new WeixinException(e.getMessage());
} finally { } finally {
if (ca != null) { if (ca != null) {
try { try {

View File

@ -4,7 +4,6 @@ import java.io.BufferedReader;
import java.io.BufferedWriter; import java.io.BufferedWriter;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.File; import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter; import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@ -102,7 +101,7 @@ public class Pay3Api {
* 要采用原来的退款单号总退款金额不能超过用户实际支付金额 * 要采用原来的退款单号总退款金额不能超过用户实际支付金额
* </p> * </p>
* *
* @param caFile * @param ca
* 证书文件(V3版本后缀为*.p12) * 证书文件(V3版本后缀为*.p12)
* @param idQuery * @param idQuery
* 商户系统内部的订单号, transaction_id out_trade_no 二选一,如果同时存在优先级: * 商户系统内部的订单号, transaction_id out_trade_no 二选一,如果同时存在优先级:
@ -123,14 +122,11 @@ public class Pay3Api {
* @since V3 * @since V3
* @throws WeixinException * @throws WeixinException
*/ */
protected RefundResult refundApply(File caFile, IdQuery idQuery, protected RefundResult refundApply(InputStream ca, IdQuery idQuery,
String outRefundNo, double totalFee, double refundFee, String outRefundNo, double totalFee, double refundFee,
String opUserId, Map<String, String> mopara) throws WeixinException { String opUserId, Map<String, String> mopara) throws WeixinException {
WeixinResponse response = null; WeixinResponse response = null;
InputStream ca = null;
try { try {
ca = new FileInputStream(caFile);
Map<String, String> map = baseMap(idQuery); Map<String, String> map = baseMap(idQuery);
map.put("out_refund_no", outRefundNo); map.put("out_refund_no", outRefundNo);
map.put("total_fee", DateUtil.formaFee2Fen(totalFee)); map.put("total_fee", DateUtil.formaFee2Fen(totalFee));
@ -149,10 +145,6 @@ public class Pay3Api {
SSLHttpClinet request = new SSLHttpClinet(weixinAccount.getMchId(), SSLHttpClinet request = new SSLHttpClinet(weixinAccount.getMchId(),
ca); ca);
response = request.post(PayURLConsts.MCH_REFUNDAPPLY_URL, param); response = request.post(PayURLConsts.MCH_REFUNDAPPLY_URL, param);
} catch (WeixinException e) {
throw e;
} catch (IOException e) {
throw new WeixinException(e.getMessage());
} finally { } finally {
if (ca != null) { if (ca != null) {
try { try {
@ -169,7 +161,7 @@ public class Pay3Api {
/** /**
* 退款申请 * 退款申请
* *
* @param caFile * @param ca
* 证书文件(V3版本后缀为*.p12) * 证书文件(V3版本后缀为*.p12)
* @param idQuery * @param idQuery
* 商户系统内部的订单号, transaction_id out_trade_no 二选一,如果同时存在优先级: * 商户系统内部的订单号, transaction_id out_trade_no 二选一,如果同时存在优先级:
@ -184,9 +176,9 @@ public class Pay3Api {
* 货币类型符合ISO 4217标准的三位字母代码默认人民币CNY * 货币类型符合ISO 4217标准的三位字母代码默认人民币CNY
* @param opUserId * @param opUserId
* 操作员帐号, 默认为商户号 * 操作员帐号, 默认为商户号
* @see {@link com.foxinmy.weixin4j.api.Pay3Api#refundApply(File, IdQuery, String, double, double, String, Map)} * @see {@link com.foxinmy.weixin4j.api.Pay3Api#refundApply(InputStream, IdQuery, String, double, double, String, Map)}
*/ */
public RefundResult refundApply(File caFile, IdQuery idQuery, public RefundResult refundApply(InputStream ca, IdQuery idQuery,
String outRefundNo, double totalFee, double refundFee, String outRefundNo, double totalFee, double refundFee,
CurrencyType refundFeeType, String opUserId) throws WeixinException { CurrencyType refundFeeType, String opUserId) throws WeixinException {
Map<String, String> mopara = new HashMap<String, String>(); Map<String, String> mopara = new HashMap<String, String>();
@ -194,7 +186,7 @@ public class Pay3Api {
refundFeeType = CurrencyType.CNY; refundFeeType = CurrencyType.CNY;
} }
mopara.put("refund_fee_type", refundFeeType.name()); mopara.put("refund_fee_type", refundFeeType.name());
return refundApply(caFile, idQuery, outRefundNo, totalFee, refundFee, return refundApply(ca, idQuery, outRefundNo, totalFee, refundFee,
opUserId, mopara); opUserId, mopara);
} }
@ -204,7 +196,7 @@ public class Pay3Api {
* 如需实现相同功能请调用退款接口</font></br> <font * 如需实现相同功能请调用退款接口</font></br> <font
* color="red">调用扣款接口后请勿立即调用撤销,需要等待5秒以上先调用查单接口,如果没有确切的返回,再调用撤销</font></br> * color="red">调用扣款接口后请勿立即调用撤销,需要等待5秒以上先调用查单接口,如果没有确切的返回,再调用撤销</font></br>
* *
* @param caFile * @param ca
* 证书文件(V3版本后缀为*.p12) * 证书文件(V3版本后缀为*.p12)
* @param idQuery * @param idQuery
* 商户系统内部的订单号, transaction_id out_trade_no 二选一,如果同时存在优先级: * 商户系统内部的订单号, transaction_id out_trade_no 二选一,如果同时存在优先级:
@ -213,11 +205,9 @@ public class Pay3Api {
* @since V3 * @since V3
* @throws WeixinException * @throws WeixinException
*/ */
public ApiResult reverseOrder(File caFile, IdQuery idQuery) public ApiResult reverseOrder(InputStream ca, IdQuery idQuery)
throws WeixinException { throws WeixinException {
InputStream ca = null;
try { try {
ca = new FileInputStream(caFile);
SSLHttpClinet request = new SSLHttpClinet(weixinAccount.getMchId(), SSLHttpClinet request = new SSLHttpClinet(weixinAccount.getMchId(),
ca); ca);
Map<String, String> map = baseMap(idQuery); Map<String, String> map = baseMap(idQuery);
@ -229,8 +219,6 @@ public class Pay3Api {
PayURLConsts.MCH_ORDERREVERSE_URL, param); PayURLConsts.MCH_ORDERREVERSE_URL, param);
return response.getAsObject(new TypeReference<ApiResult>() { return response.getAsObject(new TypeReference<ApiResult>() {
}); });
} catch (IOException e) {
throw new WeixinException(e.getMessage());
} finally { } finally {
if (ca != null) { if (ca != null) {
try { try {

View File

@ -1,6 +1,9 @@
package com.foxinmy.weixin4j.payment; package com.foxinmy.weixin4j.payment;
import java.io.File; import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date; import java.util.Date;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
@ -45,7 +48,7 @@ public class WeixinPayProxy {
private final CouponApi couponApi; private final CouponApi couponApi;
private final CashApi cashApi; private final CashApi cashApi;
private final File DEFAULT_CA_FILE; private final String DEFAULT_CA_FILE;
/** /**
* 使用weixin4j.properties配置的账号信息 * 使用weixin4j.properties配置的账号信息
@ -65,8 +68,8 @@ public class WeixinPayProxy {
this.pay3Api = new Pay3Api(weixinAccount); this.pay3Api = new Pay3Api(weixinAccount);
this.couponApi = new CouponApi(weixinAccount); this.couponApi = new CouponApi(weixinAccount);
this.cashApi = new CashApi(weixinAccount); this.cashApi = new CashApi(weixinAccount);
this.DEFAULT_CA_FILE = new File(ConfigUtil.getClassPathValue("ca_file", this.DEFAULT_CA_FILE = ConfigUtil.getClassPathValue("ca_file",
Weixin4jConst.DEFAULT_MEDIA_PATH)); Weixin4jConst.DEFAULT_MEDIA_PATH);
} }
/** /**
@ -104,7 +107,7 @@ public class WeixinPayProxy {
* 要采用原来的退款单号总退款金额不能超过用户实际支付金额 * 要采用原来的退款单号总退款金额不能超过用户实际支付金额
* </p> * </p>
* *
* @param caFile * @param ca
* 证书文件(后缀为*.p12) * 证书文件(后缀为*.p12)
* @param idQuery * @param idQuery
* 商户系统内部的订单号, transaction_id out_trade_no 二选一,如果同时存在优先级: * 商户系统内部的订单号, transaction_id out_trade_no 二选一,如果同时存在优先级:
@ -130,23 +133,27 @@ public class WeixinPayProxy {
* @throws WeixinException * @throws WeixinException
*/ */
public com.foxinmy.weixin4j.payment.mch.RefundResult refundApply( public com.foxinmy.weixin4j.payment.mch.RefundResult refundApply(
File caFile, IdQuery idQuery, String outRefundNo, double totalFee, InputStream ca, IdQuery idQuery, String outRefundNo,
double refundFee, CurrencyType refundFeeType, String opUserId) double totalFee, double refundFee, CurrencyType refundFeeType,
throws WeixinException { String opUserId) throws WeixinException {
return pay3Api.refundApply(caFile, idQuery, outRefundNo, totalFee, return pay3Api.refundApply(ca, idQuery, outRefundNo, totalFee,
refundFee, refundFeeType, opUserId); refundFee, refundFeeType, opUserId);
} }
/** /**
* 退款申请采用properties中配置的ca文件 * 退款申请采用properties中配置的ca文件
* *
* @see {@link com.foxinmy.weixin4j.payment.WeixinPayProxy#refundV3(File, IdQuery, String, double, double,CurrencyType, String)} * @throws IOException
*
* @see {@link com.foxinmy.weixin4j.payment.WeixinPayProxy#refund(InputStream, IdQuery, String, double, double,CurrencyType, String)}
*/ */
public com.foxinmy.weixin4j.payment.mch.RefundResult refundApply( public com.foxinmy.weixin4j.payment.mch.RefundResult refundApply(
IdQuery idQuery, String outRefundNo, double totalFee, IdQuery idQuery, String outRefundNo, double totalFee,
double refundFee, String opUserId) throws WeixinException { double refundFee, String opUserId) throws WeixinException,
return pay3Api.refundApply(DEFAULT_CA_FILE, idQuery, outRefundNo, IOException {
totalFee, refundFee, CurrencyType.CNY, opUserId); return pay3Api.refundApply(new FileInputStream(DEFAULT_CA_FILE),
idQuery, outRefundNo, totalFee, refundFee, CurrencyType.CNY,
opUserId);
} }
/** /**
@ -214,9 +221,9 @@ public class WeixinPayProxy {
* @since V3 * @since V3
* @throws WeixinException * @throws WeixinException
*/ */
public ApiResult reverseOrder(File caFile, IdQuery idQuery) public ApiResult reverseOrder(InputStream ca, IdQuery idQuery)
throws WeixinException { throws WeixinException {
return pay3Api.reverseOrder(caFile, idQuery); return pay3Api.reverseOrder(ca, idQuery);
} }
/** /**
@ -225,11 +232,14 @@ public class WeixinPayProxy {
* @param idQuery * @param idQuery
* transaction_idout_trade_no 二选一 * transaction_idout_trade_no 二选一
* @return 撤销结果 * @return 撤销结果
* @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#reverse(File, IdQuery)} * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#reverse(InputStream, IdQuery)}
* @throws WeixinException * @throws WeixinException
* @throws IOException
*/ */
public ApiResult reverseOrder(IdQuery idQuery) throws WeixinException { public ApiResult reverseOrder(IdQuery idQuery) throws WeixinException,
return pay3Api.reverseOrder(DEFAULT_CA_FILE, idQuery); IOException {
return pay3Api.reverseOrder(new FileInputStream(DEFAULT_CA_FILE),
idQuery);
} }
/** /**
@ -305,7 +315,7 @@ public class WeixinPayProxy {
/** /**
* 发放代金券(需要证书) * 发放代金券(需要证书)
* *
* @param caFile * @param ca
* 证书文件(后缀为*.p12) * 证书文件(后缀为*.p12)
* @param couponStockId * @param couponStockId
* 代金券批次id * 代金券批次id
@ -322,22 +332,22 @@ public class WeixinPayProxy {
* href="http://pay.weixin.qq.com/wiki/doc/api/sp_coupon.php?chapter=12_3">发放代金券接口</a> * href="http://pay.weixin.qq.com/wiki/doc/api/sp_coupon.php?chapter=12_3">发放代金券接口</a>
* @throws WeixinException * @throws WeixinException
*/ */
public CouponResult sendCoupon(File caFile, String couponStockId, public CouponResult sendCoupon(InputStream ca, String couponStockId,
String partnerTradeNo, String openId, String opUserId) String partnerTradeNo, String openId, String opUserId)
throws WeixinException { throws WeixinException {
return couponApi.sendCoupon(caFile, couponStockId, partnerTradeNo, return couponApi.sendCoupon(ca, couponStockId, partnerTradeNo, openId,
openId, opUserId); opUserId);
} }
/** /**
* 发放代金券采用properties中配置的ca文件 * 发放代金券采用properties中配置的ca文件
* *
* @see {@link com.foxinmy.weixin4j.payment.WeixinPayProxy#sendCoupon(File, String, String, String, String)} * @see {@link com.foxinmy.weixin4j.payment.WeixinPayProxy#sendCoupon(InputStream, String, String, String, String)}
*/ */
public CouponResult sendCoupon(String couponStockId, String partnerTradeNo, public CouponResult sendCoupon(String couponStockId, String partnerTradeNo,
String openId) throws WeixinException { String openId) throws WeixinException, IOException {
return couponApi.sendCoupon(DEFAULT_CA_FILE, couponStockId, return couponApi.sendCoupon(new FileInputStream(DEFAULT_CA_FILE),
partnerTradeNo, openId, null); couponStockId, partnerTradeNo, openId, null);
} }
/** /**
@ -377,7 +387,7 @@ public class WeixinPayProxy {
/** /**
* 发放红包 企业向微信用户个人发现金红包 * 发放红包 企业向微信用户个人发现金红包
* *
* @param caFile * @param ca
* 证书文件(V3版本后缀为*.p12) * 证书文件(V3版本后缀为*.p12)
* @param redpacket * @param redpacket
* 红包信息 * 红包信息
@ -389,25 +399,26 @@ public class WeixinPayProxy {
* href="http://pay.weixin.qq.com/wiki/doc/api/cash_coupon.php?chapter=13_5">红包接口说明</a> * href="http://pay.weixin.qq.com/wiki/doc/api/cash_coupon.php?chapter=13_5">红包接口说明</a>
* @throws WeixinException * @throws WeixinException
*/ */
public RedpacketSendResult sendRedpack(File caFile, Redpacket redpacket) public RedpacketSendResult sendRedpack(InputStream ca, Redpacket redpacket)
throws WeixinException { throws WeixinException {
return cashApi.sendRedpack(caFile, redpacket); return cashApi.sendRedpack(ca, redpacket);
} }
/** /**
* 发放红包采用properties中配置的ca文件 * 发放红包采用properties中配置的ca文件
* *
* @see {@link com.foxinmy.weixin4j.payment.WeixinPayProxy#sendRedpack(File, Redpacket)} * @see {@link com.foxinmy.weixin4j.payment.WeixinPayProxy#sendRedpack(InputStream, Redpacket)}
*/ */
public RedpacketSendResult sendRedpack(Redpacket redpacket) public RedpacketSendResult sendRedpack(Redpacket redpacket)
throws WeixinException { throws WeixinException, IOException {
return cashApi.sendRedpack(DEFAULT_CA_FILE, redpacket); return cashApi.sendRedpack(new FileInputStream(DEFAULT_CA_FILE),
redpacket);
} }
/** /**
* 查询红包记录 * 查询红包记录
* *
* @param caFile * @param ca
* 证书文件(V3版本后缀为*.p12) * 证书文件(V3版本后缀为*.p12)
* @param outTradeNo * @param outTradeNo
* 商户发放红包的商户订单号 * 商户发放红包的商户订单号
@ -418,25 +429,26 @@ public class WeixinPayProxy {
* href="http://pay.weixin.qq.com/wiki/doc/api/cash_coupon.php?chapter=13_6">查询红包接口说明</a> * href="http://pay.weixin.qq.com/wiki/doc/api/cash_coupon.php?chapter=13_6">查询红包接口说明</a>
* @throws WeixinException * @throws WeixinException
*/ */
public RedpacketRecord queryRedpack(File caFile, String outTradeNo) public RedpacketRecord queryRedpack(InputStream ca, String outTradeNo)
throws WeixinException { throws WeixinException {
return cashApi.queryRedpack(caFile, outTradeNo); return cashApi.queryRedpack(ca, outTradeNo);
} }
/** /**
* 查询红包采用properties中配置的ca文件 * 查询红包采用properties中配置的ca文件
* *
* @see {@link com.foxinmy.weixin4j.payment.WeixinPayProxy#queryRedpack(File,String)} * @see {@link com.foxinmy.weixin4j.payment.WeixinPayProxy#queryRedpack(InputStream,String)}
*/ */
public RedpacketRecord queryRedpack(String outTradeNo) public RedpacketRecord queryRedpack(String outTradeNo)
throws WeixinException { throws WeixinException, IOException {
return cashApi.queryRedpack(DEFAULT_CA_FILE, outTradeNo); return cashApi.queryRedpack(new FileInputStream(DEFAULT_CA_FILE),
outTradeNo);
} }
/** /**
* 企业付款 实现企业向个人付款针对部分有开发能力的商户 提供通过API完成企业付款的功能 比如目前的保险行业向客户退保给付理赔 * 企业付款 实现企业向个人付款针对部分有开发能力的商户 提供通过API完成企业付款的功能 比如目前的保险行业向客户退保给付理赔
* *
* @param caFile * @param ca
* 证书文件(V3版本后缀为*.p12) * 证书文件(V3版本后缀为*.p12)
* @param mpPayment * @param mpPayment
* 付款信息 * 付款信息
@ -448,25 +460,26 @@ public class WeixinPayProxy {
* href="http://pay.weixin.qq.com/wiki/doc/api/mch_pay.php?chapter=14_1">企业付款</a> * href="http://pay.weixin.qq.com/wiki/doc/api/mch_pay.php?chapter=14_1">企业付款</a>
* @throws WeixinException * @throws WeixinException
*/ */
public MPPaymentResult mpPayment(File caFile, MPPayment mpPayment) public MPPaymentResult mpPayment(InputStream ca, MPPayment mpPayment)
throws WeixinException { throws WeixinException {
return cashApi.mchPayment(caFile, mpPayment); return cashApi.mchPayment(ca, mpPayment);
} }
/** /**
* 企业付款采用properties中配置的ca文件 * 企业付款采用properties中配置的ca文件
* *
* @see {@link com.foxinmy.weixin4j.payment.WeixinPayProxy#mpPayment(File, MPPayment)} * @see {@link com.foxinmy.weixin4j.payment.WeixinPayProxy#mpPayment(InputStream, MPPayment)}
*/ */
public MPPaymentResult mpPayment(MPPayment mpPayment) public MPPaymentResult mpPayment(MPPayment mpPayment)
throws WeixinException { throws WeixinException, IOException {
return cashApi.mchPayment(DEFAULT_CA_FILE, mpPayment); return cashApi.mchPayment(new FileInputStream(DEFAULT_CA_FILE),
mpPayment);
} }
/** /**
* 企业付款查询 用于商户的企业付款操作进行结果查询返回付款操作详细结果 * 企业付款查询 用于商户的企业付款操作进行结果查询返回付款操作详细结果
* *
* @param caFile * @param ca
* 证书文件(V3版本后缀为*.p12) * 证书文件(V3版本后缀为*.p12)
* @param outTradeNo * @param outTradeNo
* 商户调用企业付款API时使用的商户订单号 * 商户调用企业付款API时使用的商户订单号
@ -477,18 +490,19 @@ public class WeixinPayProxy {
* href="http://pay.weixin.qq.com/wiki/doc/api/mch_pay.php?chapter=14_3">企业付款查询</a> * href="http://pay.weixin.qq.com/wiki/doc/api/mch_pay.php?chapter=14_3">企业付款查询</a>
* @throws WeixinException * @throws WeixinException
*/ */
public MPPaymentRecord mpPaymentQuery(File caFile, String outTradeNo) public MPPaymentRecord mpPaymentQuery(InputStream ca, String outTradeNo)
throws WeixinException { throws WeixinException {
return cashApi.mchPaymentQuery(caFile, outTradeNo); return cashApi.mchPaymentQuery(ca, outTradeNo);
} }
/** /**
* 企业付款查询采用properties中配置的ca文件 * 企业付款查询采用properties中配置的ca文件
* *
* @see {@link com.foxinmy.weixin4j.payment.WeixinPayProxy#mpPaymentQuery(File, String)} * @see {@link com.foxinmy.weixin4j.payment.WeixinPayProxy#mpPaymentQuery(InputStream, String)}
*/ */
public MPPaymentRecord mpPaymentQuery(String outTradeNo) public MPPaymentRecord mpPaymentQuery(String outTradeNo)
throws WeixinException { throws WeixinException, IOException {
return cashApi.mchPaymentQuery(DEFAULT_CA_FILE, outTradeNo); return cashApi.mchPaymentQuery(new FileInputStream(DEFAULT_CA_FILE),
outTradeNo);
} }
} }

View File

@ -1,5 +1,8 @@
package com.foxinmy.weixin4j.mp.test; package com.foxinmy.weixin4j.mp.test;
import java.io.FileInputStream;
import java.io.IOException;
import org.junit.Test; import org.junit.Test;
import com.foxinmy.weixin4j.exception.WeixinException; import com.foxinmy.weixin4j.exception.WeixinException;
@ -22,7 +25,7 @@ import com.foxinmy.weixin4j.type.MPPaymentCheckNameType;
public class CashTest extends CouponTest { public class CashTest extends CouponTest {
@Test @Test
public void sendRedpacket() throws WeixinException { public void sendRedpacket() throws WeixinException, IOException {
Redpacket redpacket = new Redpacket("HB001", "无忧钱庄", "无忧钱庄", Redpacket redpacket = new Redpacket("HB001", "无忧钱庄", "无忧钱庄",
"oyFLst1bqtuTcxK-ojF8hOGtLQao", 1d); "oyFLst1bqtuTcxK-ojF8hOGtLQao", 1d);
redpacket.setActName("红包测试"); redpacket.setActName("红包测试");
@ -32,23 +35,26 @@ public class CashTest extends CouponTest {
redpacket.setRemark("快来领取红包吧!"); redpacket.setRemark("快来领取红包吧!");
redpacket.setTotalNum(1); redpacket.setTotalNum(1);
redpacket.setWishing("来就送钱"); redpacket.setWishing("来就送钱");
RedpacketSendResult result = WEIXINPAY.sendRedpack(caFile, redpacket); RedpacketSendResult result = WEIXINPAY.sendRedpack(new FileInputStream(
caFile), redpacket);
System.err.println(result); System.err.println(result);
} }
@Test @Test
public void queryRedpacket() throws WeixinException { public void queryRedpacket() throws WeixinException, IOException {
String outTradeNo = "HB001"; String outTradeNo = "HB001";
RedpacketRecord record = WEIXINPAY.queryRedpack(caFile, outTradeNo); RedpacketRecord record = WEIXINPAY.queryRedpack(new FileInputStream(
caFile), outTradeNo);
System.err.println(record); System.err.println(record);
} }
@Test @Test
public void mpPayment() throws WeixinException { public void mpPayment() throws WeixinException, IOException {
MPPayment payment = new MPPayment("MP001", MPPayment payment = new MPPayment("MP001",
"oyFLst1bqtuTcxK-ojF8hOGtLQao", "oyFLst1bqtuTcxK-ojF8hOGtLQao",
MPPaymentCheckNameType.NO_CHECK, "企业付款测试", 0.01d, "127.0.0.1"); MPPaymentCheckNameType.NO_CHECK, "企业付款测试", 0.01d, "127.0.0.1");
MPPaymentResult result = WEIXINPAY.mpPayment(caFile, payment); MPPaymentResult result = WEIXINPAY.mpPayment(
new FileInputStream(caFile), payment);
System.err.println(result); System.err.println(result);
} }
} }

View File

@ -1,6 +1,8 @@
package com.foxinmy.weixin4j.mp.test; package com.foxinmy.weixin4j.mp.test;
import java.io.File; import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Date; import java.util.Date;
import org.junit.Assert; import org.junit.Assert;
@ -34,11 +36,11 @@ public class CouponTest {
protected final File caFile = new File("证书文件路径(*.p12)"); protected final File caFile = new File("证书文件路径(*.p12)");
@Test @Test
public void sendCoupon() throws WeixinException { public void sendCoupon() throws WeixinException, IOException {
String partnerTradeNo = String.format("%s%s%s", ACCOUNT.getMchId(), String partnerTradeNo = String.format("%s%s%s", ACCOUNT.getMchId(),
DateUtil.fortmat2yyyyMMdd(new Date()), "1"); DateUtil.fortmat2yyyyMMdd(new Date()), "1");
CouponResult result = WEIXINPAY.sendCoupon(caFile, "123", CouponResult result = WEIXINPAY.sendCoupon(new FileInputStream(caFile),
partnerTradeNo, "oyFLst1bqtuTcxK-ojF8hOGtLQao", null); "123", partnerTradeNo, "oyFLst1bqtuTcxK-ojF8hOGtLQao", null);
Assert.assertTrue(result.getRetCode().equalsIgnoreCase(Consts.SUCCESS)); Assert.assertTrue(result.getRetCode().equalsIgnoreCase(Consts.SUCCESS));
} }

View File

@ -1,6 +1,8 @@
package com.foxinmy.weixin4j.mp.test; package com.foxinmy.weixin4j.mp.test;
import java.io.File; import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
@ -109,13 +111,13 @@ public class PayTest {
} }
@Test @Test
public void refundV3() throws WeixinException { public void refundV3() throws WeixinException, IOException {
File caFile = new File("签名文件如123.p12"); File caFile = new File("签名文件如123.p12");
IdQuery idQuery = new IdQuery("TT_1427183696238", IdType.TRADENO); IdQuery idQuery = new IdQuery("TT_1427183696238", IdType.TRADENO);
com.foxinmy.weixin4j.payment.mch.RefundResult result = PAY3 com.foxinmy.weixin4j.payment.mch.RefundResult result = PAY3
.refundApply(caFile, idQuery, .refundApply(new FileInputStream(caFile), idQuery, "TT_R"
"TT_R" + System.currentTimeMillis(), 0.01d, 0.01d, + System.currentTimeMillis(), 0.01d, 0.01d, null,
null, "10020674"); "10020674");
System.err.println(result); System.err.println(result);
String sign = result.getSign(); String sign = result.getSign();
result.setSign(null); result.setSign(null);

View File

@ -579,8 +579,6 @@ public class WeixinProxy {
* *
* @param code * @param code
* 通过员工授权获取到的code每次员工授权带上的code将不一样code只能使用一次5分钟未被使用自动过期 * 通过员工授权获取到的code每次员工授权带上的code将不一样code只能使用一次5分钟未被使用自动过期
* @param agentid
* 跳转链接时所在的企业应用ID
* @see com.foxinmy.weixin4j.qy.model.User * @see com.foxinmy.weixin4j.qy.model.User
* @see com.foxinmy.weixin4j.qy.api.UserApi * @see com.foxinmy.weixin4j.qy.api.UserApi
* @return 成员对象 * @return 成员对象
@ -592,8 +590,8 @@ public class WeixinProxy {
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E6%A0%B9%E6%8D%AEcode%E8%8E%B7%E5%8F%96%E6%88%90%E5%91%98%E4%BF%A1%E6%81%AF">根据code获取成员信息</a> * href="http://qydev.weixin.qq.com/wiki/index.php?title=%E6%A0%B9%E6%8D%AEcode%E8%8E%B7%E5%8F%96%E6%88%90%E5%91%98%E4%BF%A1%E6%81%AF">根据code获取成员信息</a>
* @throws WeixinException * @throws WeixinException
*/ */
public User getUserByCode(String code, int agentid) throws WeixinException { public User getUserByCode(String code) throws WeixinException {
return userApi.getUserByCode(code, agentid); return userApi.getUserByCode(code);
} }
/** /**
@ -601,9 +599,8 @@ public class WeixinProxy {
* *
* @param code * @param code
* 通过员工授权获取到的code每次员工授权带上的code将不一样code只能使用一次5分钟未被使用自动过期 * 通过员工授权获取到的code每次员工授权带上的code将不一样code只能使用一次5分钟未被使用自动过期
* @param agentid * @return { "UserId":"USERID", "DeviceId":"DEVICEID" } or
* 跳转链接时所在的企业应用ID * {"OpenId":"OPENID","DeviceId":"DEVICEID"}
* @return { "UserId":"USERID", "DeviceId":"DEVICEID" }
* @see com.foxinmy.weixin4j.qy.api.UserApi * @see com.foxinmy.weixin4j.qy.api.UserApi
* @see <a * @see <a
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E4%BC%81%E4%B8%9A%E8%8E%B7%E5%8F%96code">企业获取code</a> * href="http://qydev.weixin.qq.com/wiki/index.php?title=%E4%BC%81%E4%B8%9A%E8%8E%B7%E5%8F%96code">企业获取code</a>
@ -611,9 +608,8 @@ public class WeixinProxy {
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E6%A0%B9%E6%8D%AEcode%E8%8E%B7%E5%8F%96%E6%88%90%E5%91%98%E4%BF%A1%E6%81%AF">根据code获取成员信息</a> * href="http://qydev.weixin.qq.com/wiki/index.php?title=%E6%A0%B9%E6%8D%AEcode%E8%8E%B7%E5%8F%96%E6%88%90%E5%91%98%E4%BF%A1%E6%81%AF">根据code获取成员信息</a>
* @throws WeixinException * @throws WeixinException
*/ */
public JSONObject getUserIdByCode(String code, int agentid) public JSONObject getUserIdByCode(String code) throws WeixinException {
throws WeixinException { return userApi.getUserIdByCode(code);
return userApi.getUserIdByCode(code, agentid);
} }
/** /**

View File

@ -156,8 +156,6 @@ public class UserApi extends QyApi {
* *
* @param code * @param code
* 通过员工授权获取到的code每次员工授权带上的code将不一样code只能使用一次5分钟未被使用自动过期 * 通过员工授权获取到的code每次员工授权带上的code将不一样code只能使用一次5分钟未被使用自动过期
* @param agentid
* 跳转链接时所在的企业应用ID
* @see com.foxinmy.weixin4j.qy.model.User * @see com.foxinmy.weixin4j.qy.model.User
* @see com.foxinmy.weixin4j.qy.api.UserApi * @see com.foxinmy.weixin4j.qy.api.UserApi
* @return 成员对象 * @return 成员对象
@ -169,8 +167,8 @@ public class UserApi extends QyApi {
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E6%A0%B9%E6%8D%AEcode%E8%8E%B7%E5%8F%96%E6%88%90%E5%91%98%E4%BF%A1%E6%81%AF">根据code获取成员信息</a> * href="http://qydev.weixin.qq.com/wiki/index.php?title=%E6%A0%B9%E6%8D%AEcode%E8%8E%B7%E5%8F%96%E6%88%90%E5%91%98%E4%BF%A1%E6%81%AF">根据code获取成员信息</a>
* @throws WeixinException * @throws WeixinException
*/ */
public User getUserByCode(String code, int agentid) throws WeixinException { public User getUserByCode(String code) throws WeixinException {
return getUser(getUserIdByCode(code, agentid).getString("UserId")); return getUser(getUserIdByCode(code).getString("UserId"));
} }
/** /**
@ -200,8 +198,6 @@ public class UserApi extends QyApi {
* *
* @param code * @param code
* 通过员工授权获取到的code每次员工授权带上的code将不一样code只能使用一次5分钟未被使用自动过期 * 通过员工授权获取到的code每次员工授权带上的code将不一样code只能使用一次5分钟未被使用自动过期
* @param agentid
* 跳转链接时所在的企业应用ID
* @return { "UserId":"USERID", "DeviceId":"DEVICEID" } * @return { "UserId":"USERID", "DeviceId":"DEVICEID" }
* @see <a * @see <a
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E4%BC%81%E4%B8%9A%E8%8E%B7%E5%8F%96code">企业获取code</a> * href="http://qydev.weixin.qq.com/wiki/index.php?title=%E4%BC%81%E4%B8%9A%E8%8E%B7%E5%8F%96code">企业获取code</a>
@ -209,12 +205,11 @@ public class UserApi extends QyApi {
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E6%A0%B9%E6%8D%AEcode%E8%8E%B7%E5%8F%96%E6%88%90%E5%91%98%E4%BF%A1%E6%81%AF">根据code获取成员信息</a> * href="http://qydev.weixin.qq.com/wiki/index.php?title=%E6%A0%B9%E6%8D%AEcode%E8%8E%B7%E5%8F%96%E6%88%90%E5%91%98%E4%BF%A1%E6%81%AF">根据code获取成员信息</a>
* @throws WeixinException * @throws WeixinException
*/ */
public JSONObject getUserIdByCode(String code, int agentid) public JSONObject getUserIdByCode(String code) throws WeixinException {
throws WeixinException {
String user_getid_uri = getRequestUri("user_getid_uri"); String user_getid_uri = getRequestUri("user_getid_uri");
Token token = tokenHolder.getToken(); Token token = tokenHolder.getToken();
WeixinResponse response = weixinClient.post(String.format( WeixinResponse response = weixinClient.post(String.format(
user_getid_uri, token.getAccessToken(), code, agentid)); user_getid_uri, token.getAccessToken(), code));
return response.getAsJson(); return response.getAsJson();
} }

View File

@ -20,7 +20,7 @@ user_update_uri={api_base_url}/user/update?access_token=%s
# \u83b7\u53d6\u6210\u5458\u4fe1\u606f # \u83b7\u53d6\u6210\u5458\u4fe1\u606f
user_get_uri={api_base_url}/user/get?access_token=%s&userid=%s user_get_uri={api_base_url}/user/get?access_token=%s&userid=%s
# code\u83b7\u53d6\u6210\u5458\u4fe1\u606f # code\u83b7\u53d6\u6210\u5458\u4fe1\u606f
user_getid_uri={api_base_url}/user/getuserinfo?access_token=%s&code=%s&agentid=%d user_getid_uri={api_base_url}/user/getuserinfo?access_token=%s&code=%s
# \u83b7\u53d6\u90e8\u95e8\u6210\u5458 # \u83b7\u53d6\u90e8\u95e8\u6210\u5458
user_slist_uri={api_base_url}/user/simplelist?access_token=%s&department_id=%d&fetch_child=%d&status=%d user_slist_uri={api_base_url}/user/simplelist?access_token=%s&department_id=%d&fetch_child=%d&status=%d
# \u83b7\u53d6\u90e8\u95e8\u6210\u5458(\u8be6\u60c5) # \u83b7\u53d6\u90e8\u95e8\u6210\u5458(\u8be6\u60c5)