11
11
import java .util .HashMap ;
12
12
import java .util .List ;
13
13
import java .util .Map ;
14
+ import java .util .Map .Entry ;
14
15
import java .util .SortedMap ;
15
16
import java .util .TreeMap ;
16
17
import java .util .UUID ;
@@ -777,43 +778,45 @@ public void setMaxRetryTimes(int maxRetryTimes) {
777
778
778
779
@ Override
779
780
public WxMpPrepayIdResult getPrepayId (String openId , String outTradeNo , double amt , String body , String tradeType , String ip , String callbackUrl ) {
780
- String nonce_str = System .currentTimeMillis () + "" ;
781
-
782
- SortedMap <String , String > packageParams = new TreeMap <String , String >();
781
+ Map <String , String > packageParams = new HashMap <String , String >();
783
782
packageParams .put ("appid" , wxMpConfigStorage .getAppId ());
784
783
packageParams .put ("mch_id" , wxMpConfigStorage .getPartnerId ());
785
- packageParams .put ("nonce_str" , nonce_str );
786
784
packageParams .put ("body" , body );
787
785
packageParams .put ("out_trade_no" , outTradeNo );
788
-
789
786
packageParams .put ("total_fee" , (int ) (amt * 100 ) + "" );
790
787
packageParams .put ("spbill_create_ip" , ip );
791
788
packageParams .put ("notify_url" , callbackUrl );
792
789
packageParams .put ("trade_type" , tradeType );
793
790
packageParams .put ("openid" , openId );
794
791
792
+ return getPrepayId (packageParams );
793
+ }
794
+
795
+ public WxMpPrepayIdResult getPrepayId (final Map <String , String > parameters ) {
796
+ String nonce_str = System .currentTimeMillis () + "" ;
797
+
798
+ final SortedMap <String , String > packageParams = new TreeMap <String , String >(parameters );
799
+ packageParams .put ("appid" , wxMpConfigStorage .getAppId ());
800
+ packageParams .put ("mch_id" , wxMpConfigStorage .getPartnerId ());
801
+ packageParams .put ("nonce_str" , nonce_str );
802
+ checkParameters (packageParams );
803
+
795
804
String sign = WxCryptUtil .createSign (packageParams , wxMpConfigStorage .getPartnerKey ());
796
- String xml = "<xml>" +
797
- "<appid>" + wxMpConfigStorage .getAppId () + "</appid>" +
798
- "<mch_id>" + wxMpConfigStorage .getPartnerId () + "</mch_id>" +
799
- "<nonce_str>" + nonce_str + "</nonce_str>" +
800
- "<sign>" + sign + "</sign>" +
801
- "<body><![CDATA[" + body + "]]></body>" +
802
- "<out_trade_no>" + outTradeNo + "</out_trade_no>" +
803
- "<total_fee>" + packageParams .get ("total_fee" ) + "</total_fee>" +
804
- "<spbill_create_ip>" + ip + "</spbill_create_ip>" +
805
- "<notify_url>" + callbackUrl + "</notify_url>" +
806
- "<trade_type>" + tradeType + "</trade_type>" +
807
- "<openid>" + openId + "</openid>" +
808
- "</xml>" ;
805
+ packageParams .put ("sign" , sign );
806
+
807
+ StringBuilder request = new StringBuilder ("<xml>" );
808
+ for (Entry <String , String > para : packageParams .entrySet ()) {
809
+ request .append (String .format ("<%s>%s</%s>" , para .getKey (), para .getValue (), para .getKey ()));
810
+ }
811
+ request .append ("</xml>" );
809
812
810
813
HttpPost httpPost = new HttpPost ("https://api.mch.weixin.qq.com/pay/unifiedorder" );
811
814
if (httpProxy != null ) {
812
815
RequestConfig config = RequestConfig .custom ().setProxy (httpProxy ).build ();
813
816
httpPost .setConfig (config );
814
817
}
815
818
816
- StringEntity entity = new StringEntity (xml , Consts .UTF_8 );
819
+ StringEntity entity = new StringEntity (request . toString () , Consts .UTF_8 );
817
820
httpPost .setEntity (entity );
818
821
try {
819
822
CloseableHttpResponse response = getHttpclient ().execute (httpPost );
@@ -828,9 +831,39 @@ public WxMpPrepayIdResult getPrepayId(String openId, String outTradeNo, double a
828
831
return new WxMpPrepayIdResult ();
829
832
}
830
833
834
+ final String [] REQUIRED_ORDER_PARAMETERS = new String [] { "appid" , "mch_id" , "body" , "out_trade_no" , "total_fee" , "spbill_create_ip" , "notify_url" ,
835
+ "trade_type" , };
836
+
837
+ private void checkParameters (Map <String , String > parameters ) {
838
+ for (String para : REQUIRED_ORDER_PARAMETERS ) {
839
+ if (!parameters .containsKey (para ))
840
+ throw new IllegalArgumentException ("Reqiured argument '" + para + "' is missing." );
841
+ }
842
+ if ("JSAPI" .equals (parameters .get ("trade_type" )) && !parameters .containsKey ("openid" ))
843
+ throw new IllegalArgumentException ("Reqiured argument 'openid' is missing when trade_type is 'JSAPI'." );
844
+ if ("NATIVE" .equals (parameters .get ("trade_type" )) && !parameters .containsKey ("product_id" ))
845
+ throw new IllegalArgumentException ("Reqiured argument 'product_id' is missing when trade_type is 'NATIVE'." );
846
+ }
847
+
831
848
@ Override
832
849
public Map <String , String > getJSSDKPayInfo (String openId , String outTradeNo , double amt , String body , String tradeType , String ip , String callbackUrl ) {
833
- WxMpPrepayIdResult wxMpPrepayIdResult = getPrepayId (openId , outTradeNo , amt , body , tradeType , ip , callbackUrl );
850
+ Map <String , String > packageParams = new HashMap <String , String >();
851
+ packageParams .put ("appid" , wxMpConfigStorage .getAppId ());
852
+ packageParams .put ("mch_id" , wxMpConfigStorage .getPartnerId ());
853
+ packageParams .put ("body" , body );
854
+ packageParams .put ("out_trade_no" , outTradeNo );
855
+ packageParams .put ("total_fee" , (int ) (amt * 100 ) + "" );
856
+ packageParams .put ("spbill_create_ip" , ip );
857
+ packageParams .put ("notify_url" , callbackUrl );
858
+ packageParams .put ("trade_type" , tradeType );
859
+ packageParams .put ("openid" , openId );
860
+
861
+ return getJSSDKPayInfo (packageParams );
862
+ }
863
+
864
+ @ Override
865
+ public Map <String , String > getJSSDKPayInfo (Map <String , String > parameters ) {
866
+ WxMpPrepayIdResult wxMpPrepayIdResult = getPrepayId (parameters );
834
867
String prepayId = wxMpPrepayIdResult .getPrepay_id ();
835
868
if (prepayId == null || prepayId .equals ("" )) {
836
869
throw new RuntimeException ("get prepayid error" );
0 commit comments