22
33import com .alibaba .fastjson .JSONObject ;
44import com .egzosn .pay .common .api .BasePayService ;
5- import com .egzosn .pay .common .api .Callback ;
65import com .egzosn .pay .common .bean .*;
76import com .egzosn .pay .common .bean .result .PayException ;
87import com .egzosn .pay .common .exception .PayErrorException ;
98import com .egzosn .pay .common .http .HttpConfigStorage ;
109import com .egzosn .pay .common .util .DateUtils ;
1110import com .egzosn .pay .common .util .Util ;
11+ import com .egzosn .pay .common .util .XML ;
1212import com .egzosn .pay .common .util .sign .SignUtils ;
1313import com .egzosn .pay .common .util .sign .encrypt .RSA2 ;
1414import com .egzosn .pay .common .util .str .StringUtils ;
15- import com .egzosn .pay .wx .bean .WxPayError ;
16- import com .egzosn .pay .wx .bean .WxPayMessage ;
17- import com .egzosn .pay .wx .bean .WxTransactionType ;
18- import com .egzosn .pay .common .util .XML ;
19- import com .egzosn .pay .wx .bean .WxTransferType ;
15+ import com .egzosn .pay .wx .bean .*;
16+
2017import java .io .IOException ;
2118import java .io .InputStream ;
22- import java .math .BigDecimal ;
2319import java .net .URLEncoder ;
20+ import java .security .GeneralSecurityException ;
2421import java .util .*;
2522
2623import static com .egzosn .pay .wx .api .WxConst .*;
3128 *
3229 * @author egan
3330 * <pre>
34- * email egzosn@gmail.com
35- * date 2016-5-18 14:09:01
36- * </pre>
31+ * email egzosn@gmail.com
32+ * date 2016-5-18 14:09:01
33+ * </pre>
3734 */
38- public class WxPayService extends BasePayService <WxPayConfigStorage > {
39-
40-
35+ public class WxPayService extends BasePayService <WxPayConfigStorage > implements WxRedPackService {
4136
4237
4338 /**
@@ -96,14 +91,14 @@ public String getReqUrl(TransactionType transactionType) {
9691 public boolean verify (Map <String , Object > params ) {
9792
9893 if (!(SUCCESS .equals (params .get (RETURN_CODE )) && SUCCESS .equals (params .get (RESULT_CODE )))) {
99- if (LOG .isErrorEnabled ()){
94+ if (LOG .isErrorEnabled ()) {
10095 LOG .error (String .format ("微信支付异常:return_code=%s,参数集=%s" , params .get (RETURN_CODE ), params ));
10196 }
10297 return false ;
10398 }
10499
105100 if (null == params .get (SIGN )) {
106- if (LOG .isDebugEnabled ()){
101+ if (LOG .isDebugEnabled ()) {
107102 LOG .debug (String .format ("微信支付异常:签名为空!%s=%s" , OUT_TRADE_NO , params .get (OUT_TRADE_NO )));
108103 }
109104 return false ;
@@ -482,25 +477,6 @@ public Map<String, Object> cancel(String transactionId, String outTradeNo) {
482477 return secondaryInterface (transactionId , outTradeNo , WxTransactionType .REVERSE );
483478 }
484479
485- /**
486- * 退款
487- *
488- * @param transactionId 微信订单号
489- * @param outTradeNo 商户单号
490- * @param refundAmount 退款金额
491- * @param totalAmount 总金额
492- * @return 返回支付方申请退款后的结果
493- * @see #refund(RefundOrder, Callback)
494- */
495- @ Deprecated
496- @ Override
497- public Map <String , Object > refund (String transactionId , String outTradeNo , BigDecimal refundAmount , BigDecimal totalAmount ) {
498-
499- return refund (new RefundOrder (transactionId , outTradeNo , refundAmount , totalAmount ));
500- }
501-
502-
503-
504480
505481 /**
506482 * 申请退款接口
@@ -529,18 +505,6 @@ public Map<String, Object> refund(RefundOrder refundOrder) {
529505 }
530506
531507
532- /**
533- * 查询退款
534- *
535- * @param transactionId 支付平台订单号
536- * @param outTradeNo 商户单号
537- * @return 返回支付方查询退款后的结果
538- */
539- @ Override
540- public Map <String , Object > refundquery (String transactionId , String outTradeNo ) {
541- return secondaryInterface (transactionId , outTradeNo , WxTransactionType .REFUNDQUERY );
542- }
543-
544508 /**
545509 * 查询退款
546510 *
@@ -633,13 +597,12 @@ public Map<String, Object> secondaryInterface(Object transactionIdOrBillDate, St
633597 * @param order 转账订单
634598 * <pre>
635599 *
636- * 注意事项:
637- * ◆ 当返回错误码为“SYSTEMERROR”时,请不要更换商户订单号,一定要使用原商户订单号重试,否则可能造成重复支付等资金风险。
638- * ◆ XML具有可扩展性,因此返回参数可能会有新增,而且顺序可能不完全遵循此文档规范,如果在解析回包的时候发生错误,请商户务必不要换单重试,请商户联系客服确认付款情况。如果有新回包字段,会更新到此API文档中。
639- * ◆ 因为错误代码字段err_code的值后续可能会增加,所以商户如果遇到回包返回新的错误码,请商户务必不要换单重试,请商户联系客服确认付款情况。如果有新的错误码,会更新到此API文档中。
640- * ◆ 错误代码描述字段err_code_des只供人工定位问题时做参考,系统实现时请不要依赖这个字段来做自动化处理。
641- *
642- * </pre>
600+ * 注意事项:
601+ * ◆ 当返回错误码为“SYSTEMERROR”时,请不要更换商户订单号,一定要使用原商户订单号重试,否则可能造成重复支付等资金风险。
602+ * ◆ XML具有可扩展性,因此返回参数可能会有新增,而且顺序可能不完全遵循此文档规范,如果在解析回包的时候发生错误,请商户务必不要换单重试,请商户联系客服确认付款情况。如果有新回包字段,会更新到此API文档中。
603+ * ◆ 因为错误代码字段err_code的值后续可能会增加,所以商户如果遇到回包返回新的错误码,请商户务必不要换单重试,请商户联系客服确认付款情况。如果有新的错误码,会更新到此API文档中。
604+ * ◆ 错误代码描述字段err_code_des只供人工定位问题时做参考,系统实现时请不要依赖这个字段来做自动化处理。
605+ * </pre>
643606 * @return 对应的转账结果
644607 */
645608 @ Override
@@ -742,7 +705,7 @@ public Map<String, Object> transferQuery(String outNo, String wxTransferType) {
742705 public String keyPublic (String content ) {
743706 try {
744707 return RSA2 .encrypt (content , payConfigStorage .getKeyPublic (), CIPHER_ALGORITHM , payConfigStorage .getInputCharset ());
745- } catch (Exception e ) {
708+ } catch (GeneralSecurityException | IOException e ) {
746709 throw new PayErrorException (new WxPayError (FAILURE , e .getLocalizedMessage ()));
747710 }
748711 }
@@ -757,4 +720,70 @@ public String keyPublic(String content) {
757720 public PayMessage createMessage (Map <String , Object > message ) {
758721 return WxPayMessage .create (message );
759722 }
723+
724+ /**
725+ * 微信发红包
726+ *
727+ * @param redpackOrder 红包实体
728+ * @return 返回发红包实体后的结果
729+ * @author: faymanwang 1057438332@qq.com
730+ */
731+ @ Override
732+ public Map <String , Object > sendredpack (RedpackOrder redpackOrder ) {
733+ Map <String , Object > parameters = new TreeMap <String , Object >();
734+ redPackParam (redpackOrder , parameters );
735+ if (WxSendredpackType .SENDGROUPREDPACK == redpackOrder .getTransferType ()) {
736+ //现金红包,小程序红包默认传1.裂变红包取传入值,且需要大于3
737+ parameters .put ("total_num" , Math .max (redpackOrder .getTotalNum (), 3 ));
738+ parameters .put ("amt_type" , "ALL_RAND" );
739+ } else if (WxSendredpackType .SENDMINIPROGRAMHB == redpackOrder .getTransferType ()) {
740+ parameters .put ("notify_way" , "MINI_PROGRAM_JSAPI" );
741+ }
742+
743+ parameters .put (SIGN , createSign (SignUtils .parameterText (parameters , "&" , SIGN ), payConfigStorage .getInputCharset ()));
744+ return requestTemplate .postForObject (getReqUrl (redpackOrder .getTransferType ()), XML .getMap2Xml (parameters ), JSONObject .class );
745+ }
746+
747+
748+ /**
749+ * 查询红包记录
750+ * 用于商户对已发放的红包进行查询红包的具体信息,可支持普通红包和裂变包
751+ * 查询红包记录API只支持查询30天内的红包订单,30天之前的红包订单请登录商户平台查询。
752+ *
753+ * @param mchBillno 商户发放红包的商户订单号
754+ * @return 返回查询结果
755+ * @author: faymanwang 1057438332@qq.com
756+ */
757+ @ Override
758+ public Map <String , Object > gethbinfo (String mchBillno ) {
759+ Map <String , Object > parameters = this .getPublicParameters ();
760+ parameters .put ("mch_billno" , mchBillno );
761+ parameters .put ("bill_type" , "MCHT" );
762+ parameters .put (SIGN , createSign (SignUtils .parameterText (parameters , "&" , SIGN ), payConfigStorage .getInputCharset ()));
763+ return requestTemplate .postForObject (getReqUrl (WxSendredpackType .GETHBINFO ), XML .getMap2Xml (parameters ), JSONObject .class );
764+ }
765+
766+ /**
767+ * 微信红包构造参数方法
768+ *
769+ * @param redpackOrder 红包实体
770+ * @param parameters 接收参数
771+ */
772+ private void redPackParam (RedpackOrder redpackOrder , Map <String , Object > parameters ) {
773+ parameters .put (NONCE_STR , SignUtils .randomStr ());
774+ parameters .put (MCH_ID , payConfigStorage .getPid ());
775+ parameters .put ("wxappid" , payConfigStorage .getAppid ());
776+ parameters .put ("send_name" , redpackOrder .getSendName ());
777+ parameters .put ("re_openid" , redpackOrder .getReOpenid ());
778+ parameters .put ("mch_billno" , redpackOrder .getMchBillno ());
779+ parameters .put ("total_amount" , Util .conversionCentAmount (redpackOrder .getTotalAmount ()));
780+ parameters .put ("total_num" , 1 );
781+ parameters .put ("wishing" , redpackOrder .getWishing ());
782+ parameters .put ("client_ip" , StringUtils .isNotEmpty (redpackOrder .getIp ()) ? redpackOrder .getIp () : "192.168.0.1" );
783+ parameters .put ("act_name" , redpackOrder .getActName ());
784+ parameters .put ("remark" , redpackOrder .getRemark ());
785+ if (StringUtils .isNotEmpty (redpackOrder .getSceneId ())) {
786+ parameters .put ("scene_id" , redpackOrder .getSceneId ());
787+ }
788+ }
760789}
0 commit comments