12
12
import java .util .Date ;
13
13
import java .util .HashMap ;
14
14
import java .util .Map ;
15
+ import java .util .Objects ;
15
16
import java .util .SortedMap ;
16
17
import java .util .TreeMap ;
17
18
import java .util .zip .GZIPInputStream ;
44
45
import com .egzosn .pay .common .bean .MethodType ;
45
46
import com .egzosn .pay .common .bean .NoticeParams ;
46
47
import com .egzosn .pay .common .bean .NoticeRequest ;
47
- import com .egzosn .pay .common .bean .Order ;
48
48
import com .egzosn .pay .common .bean .OrderParaStructure ;
49
49
import com .egzosn .pay .common .bean .PayMessage ;
50
50
import com .egzosn .pay .common .bean .PayOrder ;
@@ -155,27 +155,23 @@ public boolean verify(Map<String, Object> params) {
155
155
* @param noticeParams 回调回来的参数集
156
156
* @return 签名校验 true通过
157
157
*/
158
+ @ Override
158
159
public boolean verify (NoticeParams noticeParams ) {
159
160
final Map <String , Object > params = noticeParams .getBody ();
160
161
//如果为退款不需要校验, 直接返回,
161
- if (params .containsKey (REQ_INFO )){
162
+ if (params .containsKey (REQ_INFO )) {
162
163
return true ;
163
164
}
164
165
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 )))) {
166
167
if (LOG .isErrorEnabled ()) {
167
168
LOG .error (String .format ("微信支付异常:return_code=%s,参数集=%s" , params .get (RETURN_CODE ), params ));
168
169
}
169
170
return false ;
170
171
}
171
172
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
+
179
175
}
180
176
181
177
@@ -186,7 +182,7 @@ public boolean verify(NoticeParams noticeParams) {
186
182
* @param sign 比对的签名结果
187
183
* @return 生成的签名结果
188
184
*/
189
- public boolean signVerify (Map <String , Object > params , String sign ) {
185
+ private boolean signVerify (Map <String , Object > params , String sign ) {
190
186
return signVerify (params , sign , payConfigStorage .isTest ());
191
187
}
192
188
@@ -207,7 +203,7 @@ private boolean signVerify(Map<String, Object> params, String sign, boolean isTe
207
203
*/
208
204
private Map <String , Object > getPublicParameters () {
209
205
210
- Map <String , Object > parameters = new TreeMap <String , Object >();
206
+ Map <String , Object > parameters = new TreeMap <>();
211
207
parameters .put (APPID , payConfigStorage .getAppId ());
212
208
parameters .put (MCH_ID , payConfigStorage .getMchId ());
213
209
//判断如果是服务商模式信息则加入
@@ -298,7 +294,7 @@ public Map<String, Object> orderInfo(PayOrder order) {
298
294
return result ;
299
295
}
300
296
301
- Map <String , Object > params = new TreeMap <String , Object >();
297
+ Map <String , Object > params = new TreeMap <>();
302
298
303
299
if (WxTransactionType .JSAPI == order .getTransactionType ()) {
304
300
params .put ("signType" , payConfigStorage .getSignType ());
@@ -653,6 +649,7 @@ public Map<String, Object> refundquery(RefundOrder refundOrder) {
653
649
* RECHARGE_REFUND,返回当日充值退款订单
654
650
* @return 返回支付方下载对账单的结果
655
651
*/
652
+ @ Override
656
653
public Map <String , Object > downloadBill (Date billDate , String billType ) {
657
654
return downloadBill (billDate , WxPayBillType .valueOf (billType ));
658
655
}
@@ -668,6 +665,7 @@ public Map<String, Object> downloadBill(Date billDate, String billType) {
668
665
* RECHARGE_REFUND,返回当日充值退款订单
669
666
* @return 返回支付方下载对账单的结果, 如果【账单类型】为gzip的话则返回值中key为data值为gzip的输入流
670
667
*/
668
+ @ Override
671
669
public Map <String , Object > downloadBill (Date billDate , BillType billType ) {
672
670
//获取公共参数
673
671
Map <String , Object > parameters = getPublicParameters ();
@@ -710,24 +708,19 @@ public Map<String, Object> downloadbill(Date billDate, String billType, String p
710
708
//设置签名
711
709
setSign (parameters );
712
710
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 );
718
715
ret .put (RETURN_CODE , SUCCESS );
719
716
ret .put (RETURN_MSG_CODE , "ok" );
720
717
ret .put ("data" , path );
721
718
return ret ;
722
719
}
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 );
730
722
}
723
+
731
724
}
732
725
733
726
/**
@@ -739,15 +732,15 @@ public Map<String, Object> downloadbill(Date billDate, String billType, String p
739
732
*/
740
733
@ Deprecated
741
734
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 ());
748
742
}
749
- InputStream is = new ByteArrayInputStream (out .toByteArray ());
750
- return is ;
743
+
751
744
}
752
745
753
746
/**
@@ -758,30 +751,29 @@ public static InputStream uncompress(InputStream input) throws IOException {
758
751
* @throws IOException IOException
759
752
*/
760
753
@ Deprecated
761
- private void writeToLocal (String destination , InputStream inputStream )
762
- throws IOException {
754
+ private void writeToLocal (String destination , InputStream inputStream ) throws IOException {
763
755
764
756
// 判断字节大小
765
757
if (inputStream .available () != 0 ) {
766
- System . out . println ("结果大小:" + inputStream .available ());
758
+ LOG . debug ("结果大小:{}" , inputStream .available ());
767
759
File file = new File (destination );
768
760
if (!file .getParentFile ().exists ()) {
769
761
boolean result = file .getParentFile ().mkdirs ();
770
762
if (!result ) {
771
763
LOG .warn ("创建失败" );
772
764
}
773
765
}
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 );
781
775
}
782
- LOG .info ("最终写入字节数大小:" + len );
783
- inputStream .close ();
784
- out .close ();
776
+
785
777
}
786
778
}
787
779
@@ -813,7 +805,7 @@ private Map<String, Object> getDownloadBillParam(Date billDate, String billType,
813
805
* @param transactionType 交易类型
814
806
* @return 返回支付方对应接口的结果
815
807
*/
816
- public Map <String , Object > secondaryInterface (Object transactionIdOrBillDate , String outTradeNoBillType , TransactionType transactionType ) {
808
+ private Map <String , Object > secondaryInterface (Object transactionIdOrBillDate , String outTradeNoBillType , TransactionType transactionType ) {
817
809
818
810
if (transactionType == WxTransactionType .REFUND ) {
819
811
throw new PayErrorException (new PayException (FAILURE , "通用接口不支持:" + transactionType ));
@@ -844,18 +836,11 @@ public Map<String, Object> secondaryInterface(Object transactionIdOrBillDate, St
844
836
*
845
837
* @param order 转账订单
846
838
* <pre>
847
- *
848
- * 注意事项:
849
- * ◆ 当返回错误码为“SYSTEMERROR”时,请不要更换商户订单号,一定要使用原商户订单号重试,否则可能造成重复支付等资金风险。
850
- * ◆ XML具有可扩展性,因此返回参数可能会有新增,而且顺序可能不完全遵循此文档规范,如果在解析回包的时候发生错误,请商户务必不要换单重试,请商户联系客服确认付款情况。如果有新回包字段,会更新到此API文档中。
851
- * ◆ 因为错误代码字段err_code的值后续可能会增加,所以商户如果遇到回包返回新的错误码,请商户务必不要换单重试,请商户联系客服确认付款情况。如果有新的错误码,会更新到此API文档中。
852
- * ◆ 错误代码描述字段err_code_des只供人工定位问题时做参考,系统实现时请不要依赖这个字段来做自动化处理。
853
- * </pre>
854
- * @return 对应的转账结果
839
+ * @return 对应的转账结果
855
840
*/
856
841
@ Override
857
842
public Map <String , Object > transfer (TransferOrder order ) {
858
- Map <String , Object > parameters = new TreeMap <String , Object >();
843
+ Map <String , Object > parameters = new TreeMap <>();
859
844
860
845
861
846
parameters .put ("partner_trade_no" , order .getOutNo ());
@@ -889,7 +874,7 @@ public Map<String, Object> transfer(TransferOrder order) {
889
874
* <a href="https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_2">商户企业付款到银行卡</a>
890
875
* </p>
891
876
*/
892
- public Map <String , Object > transfers (Map <String , Object > parameters , TransferOrder order ) {
877
+ private Map <String , Object > transfers (Map <String , Object > parameters , TransferOrder order ) {
893
878
//转账到余额, 申请商户号的appid或商户号绑定的appid
894
879
parameters .put ("mch_appid" , payConfigStorage .getAppId ());
895
880
parameters .put ("openid" , order .getPayeeAccount ());
@@ -911,7 +896,7 @@ public Map<String, Object> transfers(Map<String, Object> parameters, TransferOrd
911
896
* @param order 转账订单
912
897
* @return 包装后参数信息
913
898
*/
914
- public Map <String , Object > payBank (Map <String , Object > parameters , TransferOrder order ) {
899
+ private Map <String , Object > payBank (Map <String , Object > parameters , TransferOrder order ) {
915
900
916
901
parameters .put ("enc_bank_no" , keyPublic (order .getPayeeAccount ()));
917
902
parameters .put ("enc_true_name" , keyPublic (order .getPayeeName ()));
@@ -952,7 +937,7 @@ public Map<String, Object> transferQuery(String outNo, String wxTransferType) {
952
937
}
953
938
954
939
955
- public String keyPublic (String content ) {
940
+ private String keyPublic (String content ) {
956
941
try {
957
942
return RSA2 .encrypt (content , payConfigStorage .getKeyPublic (), CIPHER_ALGORITHM , payConfigStorage .getInputCharset ());
958
943
}
@@ -981,7 +966,19 @@ public PayMessage createMessage(Map<String, Object> message) {
981
966
*/
982
967
@ Override
983
968
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 <>();
985
982
redPackParam (redpackOrder , parameters );
986
983
final TransferType transferType = redpackOrder .getTransferType ();
987
984
if (WxSendredpackType .SENDGROUPREDPACK == transferType ) {
@@ -998,7 +995,7 @@ else if (WxSendredpackType.SENDMINIPROGRAMHB == transferType) {
998
995
if (WxSendredpackType .SENDMINIPROGRAMHB != transferType || FAIL .equals (resp .getString (RESULT_CODE ))) {
999
996
return resp ;
1000
997
}
1001
- Map <String , Object > params = new TreeMap <String , Object >();
998
+ Map <String , Object > params = new TreeMap <>();
1002
999
params .put ("appId" , payConfigStorage .getAppId ());
1003
1000
params .put ("timeStamp" , System .currentTimeMillis () / 1000 + "" );
1004
1001
params .put ("nonceStr" , parameters .get (NONCE_STR ));
@@ -1021,8 +1018,22 @@ else if (WxSendredpackType.SENDMINIPROGRAMHB == transferType) {
1021
1018
*/
1022
1019
@ Override
1023
1020
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 ) {
1024
1035
Map <String , Object > parameters = this .getPublicParameters ();
1025
- parameters .put ("mch_billno" , mchBillno );
1036
+ parameters .put ("mch_billno" , mchBillNo );
1026
1037
parameters .put ("bill_type" , "MCHT" );
1027
1038
parameters .put (SIGN , createSign (SignTextUtils .parameterText (parameters , "&" , SIGN ), payConfigStorage .getInputCharset ()));
1028
1039
return requestTemplate .postForObject (getReqUrl (WxSendredpackType .GETHBINFO ), XML .getMap2Xml (parameters ), JSONObject .class );
@@ -1037,10 +1048,13 @@ public Map<String, Object> gethbinfo(String mchBillno) {
1037
1048
private void redPackParam (RedpackOrder redpackOrder , Map <String , Object > parameters ) {
1038
1049
parameters .put (NONCE_STR , SignTextUtils .randomStr ());
1039
1050
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 ());
1041
1055
parameters .put ("send_name" , redpackOrder .getSendName ());
1042
1056
parameters .put ("re_openid" , redpackOrder .getReOpenid ());
1043
- parameters .put ("mch_billno" , redpackOrder .getMchBillno ());
1057
+ parameters .put ("mch_billno" , redpackOrder .getMchBillNo ());
1044
1058
parameters .put ("total_amount" , Util .conversionCentAmount (redpackOrder .getTotalAmount ()));
1045
1059
parameters .put ("total_num" , 1 );
1046
1060
parameters .put ("wishing" , redpackOrder .getWishing ());
0 commit comments