1111import java .util .HashMap ;
1212import java .util .List ;
1313import java .util .Map ;
14+ import java .util .Map .Entry ;
1415import java .util .SortedMap ;
1516import java .util .TreeMap ;
1617import java .util .UUID ;
@@ -777,43 +778,45 @@ public void setMaxRetryTimes(int maxRetryTimes) {
777778
778779 @ Override
779780 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 >();
783782 packageParams .put ("appid" , wxMpConfigStorage .getAppId ());
784783 packageParams .put ("mch_id" , wxMpConfigStorage .getPartnerId ());
785- packageParams .put ("nonce_str" , nonce_str );
786784 packageParams .put ("body" , body );
787785 packageParams .put ("out_trade_no" , outTradeNo );
788-
789786 packageParams .put ("total_fee" , (int ) (amt * 100 ) + "" );
790787 packageParams .put ("spbill_create_ip" , ip );
791788 packageParams .put ("notify_url" , callbackUrl );
792789 packageParams .put ("trade_type" , tradeType );
793790 packageParams .put ("openid" , openId );
794791
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+
795804 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>" );
809812
810813 HttpPost httpPost = new HttpPost ("https://api.mch.weixin.qq.com/pay/unifiedorder" );
811814 if (httpProxy != null ) {
812815 RequestConfig config = RequestConfig .custom ().setProxy (httpProxy ).build ();
813816 httpPost .setConfig (config );
814817 }
815818
816- StringEntity entity = new StringEntity (xml , Consts .UTF_8 );
819+ StringEntity entity = new StringEntity (request . toString () , Consts .UTF_8 );
817820 httpPost .setEntity (entity );
818821 try {
819822 CloseableHttpResponse response = getHttpclient ().execute (httpPost );
@@ -828,9 +831,39 @@ public WxMpPrepayIdResult getPrepayId(String openId, String outTradeNo, double a
828831 return new WxMpPrepayIdResult ();
829832 }
830833
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+
831848 @ Override
832849 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 );
834867 String prepayId = wxMpPrepayIdResult .getPrepay_id ();
835868 if (prepayId == null || prepayId .equals ("" )) {
836869 throw new RuntimeException ("get prepayid error" );
0 commit comments