Skip to content

Commit bbc1056

Browse files
committed
发红包修复wxappid问题
1 parent 29db0f9 commit bbc1056

File tree

3 files changed

+151
-74
lines changed

3 files changed

+151
-74
lines changed

pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxPayService.java

Lines changed: 78 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import java.util.Date;
1313
import java.util.HashMap;
1414
import java.util.Map;
15+
import java.util.Objects;
1516
import java.util.SortedMap;
1617
import java.util.TreeMap;
1718
import java.util.zip.GZIPInputStream;
@@ -44,7 +45,6 @@
4445
import com.egzosn.pay.common.bean.MethodType;
4546
import com.egzosn.pay.common.bean.NoticeParams;
4647
import com.egzosn.pay.common.bean.NoticeRequest;
47-
import com.egzosn.pay.common.bean.Order;
4848
import com.egzosn.pay.common.bean.OrderParaStructure;
4949
import com.egzosn.pay.common.bean.PayMessage;
5050
import com.egzosn.pay.common.bean.PayOrder;
@@ -155,27 +155,23 @@ public boolean verify(Map<String, Object> params) {
155155
* @param noticeParams 回调回来的参数集
156156
* @return 签名校验 true通过
157157
*/
158+
@Override
158159
public boolean verify(NoticeParams noticeParams) {
159160
final Map<String, Object> params = noticeParams.getBody();
160161
//如果为退款不需要校验, 直接返回,
161-
if (params.containsKey(REQ_INFO)){
162+
if (params.containsKey(REQ_INFO)) {
162163
return true;
163164
}
164165

165-
if (null == params.get(SIGN) || !(SUCCESS.equals(params.get(RETURN_CODE)) && SUCCESS.equals(params.get(RESULT_CODE)))) {
166+
if (Objects.isNull(params.get(SIGN)) || !(SUCCESS.equals(params.get(RETURN_CODE)) && SUCCESS.equals(params.get(RESULT_CODE)))) {
166167
if (LOG.isErrorEnabled()) {
167168
LOG.error(String.format("微信支付异常:return_code=%s,参数集=%s", params.get(RETURN_CODE), params));
168169
}
169170
return false;
170171
}
171172

172-
try {
173-
return signVerify(params, (String) params.get(SIGN));
174-
}
175-
catch (PayErrorException e) {
176-
LOG.error("", e);
177-
}
178-
return false;
173+
return signVerify(params, (String) params.get(SIGN));
174+
179175
}
180176

181177

@@ -186,7 +182,7 @@ public boolean verify(NoticeParams noticeParams) {
186182
* @param sign 比对的签名结果
187183
* @return 生成的签名结果
188184
*/
189-
public boolean signVerify(Map<String, Object> params, String sign) {
185+
private boolean signVerify(Map<String, Object> params, String sign) {
190186
return signVerify(params, sign, payConfigStorage.isTest());
191187
}
192188

@@ -207,7 +203,7 @@ private boolean signVerify(Map<String, Object> params, String sign, boolean isTe
207203
*/
208204
private Map<String, Object> getPublicParameters() {
209205

210-
Map<String, Object> parameters = new TreeMap<String, Object>();
206+
Map<String, Object> parameters = new TreeMap<>();
211207
parameters.put(APPID, payConfigStorage.getAppId());
212208
parameters.put(MCH_ID, payConfigStorage.getMchId());
213209
//判断如果是服务商模式信息则加入
@@ -298,7 +294,7 @@ public Map<String, Object> orderInfo(PayOrder order) {
298294
return result;
299295
}
300296

301-
Map<String, Object> params = new TreeMap<String, Object>();
297+
Map<String, Object> params = new TreeMap<>();
302298

303299
if (WxTransactionType.JSAPI == order.getTransactionType()) {
304300
params.put("signType", payConfigStorage.getSignType());
@@ -653,6 +649,7 @@ public Map<String, Object> refundquery(RefundOrder refundOrder) {
653649
* RECHARGE_REFUND,返回当日充值退款订单
654650
* @return 返回支付方下载对账单的结果
655651
*/
652+
@Override
656653
public Map<String, Object> downloadBill(Date billDate, String billType) {
657654
return downloadBill(billDate, WxPayBillType.valueOf(billType));
658655
}
@@ -668,6 +665,7 @@ public Map<String, Object> downloadBill(Date billDate, String billType) {
668665
* RECHARGE_REFUND,返回当日充值退款订单
669666
* @return 返回支付方下载对账单的结果, 如果【账单类型】为gzip的话则返回值中key为data值为gzip的输入流
670667
*/
668+
@Override
671669
public Map<String, Object> downloadBill(Date billDate, BillType billType) {
672670
//获取公共参数
673671
Map<String, Object> parameters = getPublicParameters();
@@ -710,24 +708,19 @@ public Map<String, Object> downloadbill(Date billDate, String billType, String p
710708
//设置签名
711709
setSign(parameters);
712710
InputStream inputStream = requestTemplate.postForObject(getReqUrl(WxTransactionType.DOWNLOADBILL), XML.getMap2Xml(parameters), InputStream.class);
713-
try {
714-
//解压流
715-
inputStream = uncompress(inputStream);
716-
writeToLocal(path + DateUtils.formatDate(new Date(), DateUtils.YYYYMM) + "/" + DateUtils.formatDate(new Date(), DateUtils.YYYYMMDDHHMMSS) + ".txt", inputStream);
717-
Map<String, Object> ret = new HashMap<String, Object>(3);
711+
//解压流
712+
try (InputStream fileIs = uncompress(inputStream);) {
713+
writeToLocal(path + DateUtils.formatDate(new Date(), DateUtils.YYYYMM) + "/" + DateUtils.formatDate(new Date(), DateUtils.YYYYMMDDHHMMSS) + ".txt", fileIs);
714+
Map<String, Object> ret = new HashMap<>(3);
718715
ret.put(RETURN_CODE, SUCCESS);
719716
ret.put(RETURN_MSG_CODE, "ok");
720717
ret.put("data", path);
721718
return ret;
722719
}
723-
catch (Exception e) {
724-
e.printStackTrace();
725-
Map<String, Object> ret = new HashMap<String, Object>(3);
726-
ret.put(RETURN_CODE, FAIL);
727-
ret.put(RETURN_MSG_CODE, "fail");
728-
ret.put("data", e.getMessage());
729-
return ret;
720+
catch (IOException e) {
721+
throw new PayErrorException(new WxPayError(FAIL, e.getMessage()), e);
730722
}
723+
731724
}
732725

733726
/**
@@ -739,15 +732,15 @@ public Map<String, Object> downloadbill(Date billDate, String billType, String p
739732
*/
740733
@Deprecated
741734
public static InputStream uncompress(InputStream input) throws IOException {
742-
ByteArrayOutputStream out = new ByteArrayOutputStream();
743-
GZIPInputStream ungzip = new GZIPInputStream(input);
744-
byte[] buffer = new byte[1024];
745-
int n;
746-
while ((n = ungzip.read(buffer)) >= 0) {
747-
out.write(buffer, 0, n);
735+
try (GZIPInputStream ungZip = new GZIPInputStream(input); ByteArrayOutputStream out = new ByteArrayOutputStream()) {
736+
byte[] buffer = new byte[1024];
737+
int n;
738+
while ((n = ungZip.read(buffer)) >= 0) {
739+
out.write(buffer, 0, n);
740+
}
741+
return new ByteArrayInputStream(out.toByteArray());
748742
}
749-
InputStream is = new ByteArrayInputStream(out.toByteArray());
750-
return is;
743+
751744
}
752745

753746
/**
@@ -758,30 +751,29 @@ public static InputStream uncompress(InputStream input) throws IOException {
758751
* @throws IOException IOException
759752
*/
760753
@Deprecated
761-
private void writeToLocal(String destination, InputStream inputStream)
762-
throws IOException {
754+
private void writeToLocal(String destination, InputStream inputStream) throws IOException {
763755

764756
// 判断字节大小
765757
if (inputStream.available() != 0) {
766-
System.out.println("结果大小:" + inputStream.available());
758+
LOG.debug("结果大小:{}", inputStream.available());
767759
File file = new File(destination);
768760
if (!file.getParentFile().exists()) {
769761
boolean result = file.getParentFile().mkdirs();
770762
if (!result) {
771763
LOG.warn("创建失败");
772764
}
773765
}
774-
OutputStream out = new FileOutputStream(file);
775-
int size = 0;
776-
int len = 0;
777-
byte[] buf = new byte[1024];
778-
while ((size = inputStream.read(buf)) != -1) {
779-
len += size;
780-
out.write(buf, 0, size);
766+
try (OutputStream out = new FileOutputStream(file)) {
767+
int size = 0;
768+
int len = 0;
769+
byte[] buf = new byte[1024];
770+
while ((size = inputStream.read(buf)) != -1) {
771+
len += size;
772+
out.write(buf, 0, size);
773+
}
774+
LOG.debug("最终写入字节数大小:{}", len);
781775
}
782-
LOG.info("最终写入字节数大小:" + len);
783-
inputStream.close();
784-
out.close();
776+
785777
}
786778
}
787779

@@ -813,7 +805,7 @@ private Map<String, Object> getDownloadBillParam(Date billDate, String billType,
813805
* @param transactionType 交易类型
814806
* @return 返回支付方对应接口的结果
815807
*/
816-
public Map<String, Object> secondaryInterface(Object transactionIdOrBillDate, String outTradeNoBillType, TransactionType transactionType) {
808+
private Map<String, Object> secondaryInterface(Object transactionIdOrBillDate, String outTradeNoBillType, TransactionType transactionType) {
817809

818810
if (transactionType == WxTransactionType.REFUND) {
819811
throw new PayErrorException(new PayException(FAILURE, "通用接口不支持:" + transactionType));
@@ -844,18 +836,11 @@ public Map<String, Object> secondaryInterface(Object transactionIdOrBillDate, St
844836
*
845837
* @param order 转账订单
846838
* <pre>
847-
*
848-
* 注意事项:
849-
* ◆ 当返回错误码为“SYSTEMERROR”时,请不要更换商户订单号,一定要使用原商户订单号重试,否则可能造成重复支付等资金风险。
850-
* ◆ XML具有可扩展性,因此返回参数可能会有新增,而且顺序可能不完全遵循此文档规范,如果在解析回包的时候发生错误,请商户务必不要换单重试,请商户联系客服确认付款情况。如果有新回包字段,会更新到此API文档中。
851-
* ◆ 因为错误代码字段err_code的值后续可能会增加,所以商户如果遇到回包返回新的错误码,请商户务必不要换单重试,请商户联系客服确认付款情况。如果有新的错误码,会更新到此API文档中。
852-
* ◆ 错误代码描述字段err_code_des只供人工定位问题时做参考,系统实现时请不要依赖这个字段来做自动化处理。
853-
* </pre>
854-
* @return 对应的转账结果
839+
* @return 对应的转账结果
855840
*/
856841
@Override
857842
public Map<String, Object> transfer(TransferOrder order) {
858-
Map<String, Object> parameters = new TreeMap<String, Object>();
843+
Map<String, Object> parameters = new TreeMap<>();
859844

860845

861846
parameters.put("partner_trade_no", order.getOutNo());
@@ -889,7 +874,7 @@ public Map<String, Object> transfer(TransferOrder order) {
889874
* <a href="https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_2">商户企业付款到银行卡</a>
890875
* </p>
891876
*/
892-
public Map<String, Object> transfers(Map<String, Object> parameters, TransferOrder order) {
877+
private Map<String, Object> transfers(Map<String, Object> parameters, TransferOrder order) {
893878
//转账到余额, 申请商户号的appid或商户号绑定的appid
894879
parameters.put("mch_appid", payConfigStorage.getAppId());
895880
parameters.put("openid", order.getPayeeAccount());
@@ -911,7 +896,7 @@ public Map<String, Object> transfers(Map<String, Object> parameters, TransferOrd
911896
* @param order 转账订单
912897
* @return 包装后参数信息
913898
*/
914-
public Map<String, Object> payBank(Map<String, Object> parameters, TransferOrder order) {
899+
private Map<String, Object> payBank(Map<String, Object> parameters, TransferOrder order) {
915900

916901
parameters.put("enc_bank_no", keyPublic(order.getPayeeAccount()));
917902
parameters.put("enc_true_name", keyPublic(order.getPayeeName()));
@@ -952,7 +937,7 @@ public Map<String, Object> transferQuery(String outNo, String wxTransferType) {
952937
}
953938

954939

955-
public String keyPublic(String content) {
940+
private String keyPublic(String content) {
956941
try {
957942
return RSA2.encrypt(content, payConfigStorage.getKeyPublic(), CIPHER_ALGORITHM, payConfigStorage.getInputCharset());
958943
}
@@ -981,7 +966,19 @@ public PayMessage createMessage(Map<String, Object> message) {
981966
*/
982967
@Override
983968
public Map<String, Object> sendredpack(RedpackOrder redpackOrder) {
984-
Map<String, Object> parameters = new TreeMap<String, Object>();
969+
return sendRedPack(redpackOrder);
970+
}
971+
972+
/**
973+
* 微信发红包
974+
*
975+
* @param redpackOrder 红包实体
976+
* @return 返回发红包实体后的结果
977+
* @author faymanwang [email protected]
978+
*/
979+
@Override
980+
public Map<String, Object> sendRedPack(RedpackOrder redpackOrder) {
981+
Map<String, Object> parameters = new TreeMap<>();
985982
redPackParam(redpackOrder, parameters);
986983
final TransferType transferType = redpackOrder.getTransferType();
987984
if (WxSendredpackType.SENDGROUPREDPACK == transferType) {
@@ -998,7 +995,7 @@ else if (WxSendredpackType.SENDMINIPROGRAMHB == transferType) {
998995
if (WxSendredpackType.SENDMINIPROGRAMHB != transferType || FAIL.equals(resp.getString(RESULT_CODE))) {
999996
return resp;
1000997
}
1001-
Map<String, Object> params = new TreeMap<String, Object>();
998+
Map<String, Object> params = new TreeMap<>();
1002999
params.put("appId", payConfigStorage.getAppId());
10031000
params.put("timeStamp", System.currentTimeMillis() / 1000 + "");
10041001
params.put("nonceStr", parameters.get(NONCE_STR));
@@ -1021,8 +1018,22 @@ else if (WxSendredpackType.SENDMINIPROGRAMHB == transferType) {
10211018
*/
10221019
@Override
10231020
public Map<String, Object> gethbinfo(String mchBillno) {
1021+
return getHbInfo(mchBillno);
1022+
}
1023+
1024+
/**
1025+
* 查询红包记录
1026+
* 用于商户对已发放的红包进行查询红包的具体信息,可支持普通红包和裂变包
1027+
* 查询红包记录API只支持查询30天内的红包订单,30天之前的红包订单请登录商户平台查询。
1028+
*
1029+
* @param mchBillNo 商户发放红包的商户订单号
1030+
* @return 返回查询结果
1031+
* @author faymanwang [email protected]
1032+
*/
1033+
@Override
1034+
public Map<String, Object> getHbInfo(String mchBillNo) {
10241035
Map<String, Object> parameters = this.getPublicParameters();
1025-
parameters.put("mch_billno", mchBillno);
1036+
parameters.put("mch_billno", mchBillNo);
10261037
parameters.put("bill_type", "MCHT");
10271038
parameters.put(SIGN, createSign(SignTextUtils.parameterText(parameters, "&", SIGN), payConfigStorage.getInputCharset()));
10281039
return requestTemplate.postForObject(getReqUrl(WxSendredpackType.GETHBINFO), XML.getMap2Xml(parameters), JSONObject.class);
@@ -1037,10 +1048,13 @@ public Map<String, Object> gethbinfo(String mchBillno) {
10371048
private void redPackParam(RedpackOrder redpackOrder, Map<String, Object> parameters) {
10381049
parameters.put(NONCE_STR, SignTextUtils.randomStr());
10391050
parameters.put(MCH_ID, payConfigStorage.getPid());
1040-
parameters.put("wxappid", payConfigStorage.getAppId());
1051+
if (StringUtils.isEmpty(redpackOrder.getWxAppId())) {
1052+
throw new PayErrorException(new WxPayError(FAIL, "RedpackOrder#getWxAppId()公众账号appid 必填"));
1053+
}
1054+
parameters.put("wxappid", redpackOrder.getWxAppId());
10411055
parameters.put("send_name", redpackOrder.getSendName());
10421056
parameters.put("re_openid", redpackOrder.getReOpenid());
1043-
parameters.put("mch_billno", redpackOrder.getMchBillno());
1057+
parameters.put("mch_billno", redpackOrder.getMchBillNo());
10441058
parameters.put("total_amount", Util.conversionCentAmount(redpackOrder.getTotalAmount()));
10451059
parameters.put("total_num", 1);
10461060
parameters.put("wishing", redpackOrder.getWishing());

pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxRedPackService.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,17 @@ public interface WxRedPackService {
1818
*
1919
* @param redpackOrder 红包实体
2020
* @return 返回发红包实体后的结果
21+
* @see #sendRedPack(RedpackOrder)
2122
*/
23+
@Deprecated
2224
Map<String, Object> sendredpack(RedpackOrder redpackOrder);
25+
/**
26+
* 微信发红包
27+
*
28+
* @param redpackOrder 红包实体
29+
* @return 返回发红包实体后的结果
30+
*/
31+
Map<String, Object> sendRedPack(RedpackOrder redpackOrder);
2332

2433
/**
2534
* 查询红包记录
@@ -28,6 +37,17 @@ public interface WxRedPackService {
2837
*
2938
* @param mchBillno 商户发放红包的商户订单号
3039
* @return 返回查询结果
40+
* @see #getHbInfo(String)
3141
*/
42+
@Deprecated
3243
Map<String, Object> gethbinfo(String mchBillno);
44+
/**
45+
* 查询红包记录
46+
* 用于商户对已发放的红包进行查询红包的具体信息,可支持普通红包和裂变包
47+
* 查询红包记录API只支持查询30天内的红包订单,30天之前的红包订单请登录商户平台查询。
48+
*
49+
* @param mchBillNo 商户发放红包的商户订单号
50+
* @return 返回查询结果
51+
*/
52+
Map<String, Object> getHbInfo(String mchBillNo);
3353
}

0 commit comments

Comments
 (0)