L'article précédent a obtenu l'OpenID de l'utilisateur
Cet article appelle principalement l'API unique unifiée pour le paiement public WeChat
Adresse de l'API: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
En regardant le document, le processus principal est d'encapsuler environ 20 paramètres dans le format XML et de les envoyer à l'adresse d'interface donnée par WeChat, puis vous pouvez obtenir le contenu renvoyé. paiement.
Les paramètres de demande ne seront pas expliqués.
Parmi eux, une chaîne aléatoire: j'ai utilisé UUID pour tracer la ligne du milieu
Public Static String create_nonce_str () {return uuid.randomuuid (). toString (). remplace ("-", "");Numéro de commande du marchand: chaque numéro de commande ne peut être utilisé qu'une seule fois, de sorte que le horodatage ajouté au numéro de commande du système est utilisé.
Montant total: ne peut pas être
Adresse de notification: l'adresse du rappel du système après le paiement de WeChat réussi ou échoué
signe:
Importer Java.io.Serializable; chaîne privée out_trade_no; private int total_fee; Bizorder System Numéro de commande métier dans * @param IP Adresse IP de l'utilisateur * @Param OpenId's User's OpenID * @return * / public PayInfo CreatePayInfo (BizOrder BizOrder, String IP, String OpenID) {PayInfo PayInfo = new PayInfo (); Constants.Appid); Voici le corps d'un riz blanc "); payinfo.setAttach (bizOrder.getId ()); payinfo.setout_trade_no (bizOrder.getOrderCode (). Concat (" a "). Concat (dateForatuls.for Mat (new Date () , "MMDDHHMMS")); (OpenID); Retour PayInfo;Obtenez la signature:
/ ** * Obtenez la signature * @param payinfo * @return * @throws exception * / public String getsign (PayInfo PayInfo) lève une exception {String SignTemp = "AppID =" + PayInfo.getAppid () + "& attach =" + PayInfo. getattach () + "& body =" + payinfo.getbody () + "& device_info =" + payinfo.getdevice_info () + "& mch_id =" + payinfo.getmch_id () + "& nonc e_str =" + payinfo.getNonce_str () + " ¬ ify_url = "+ payinfo.getNotify_url () +" & openId = "+ payinfo.getOpenID () +" & out_trade_no = "+ payinfo.getout_trade_no () +" & spbill_ create_ip = "+ payinfo.getspbill_create_ip () +" & total_fee = "+" + PayInfo. )); Remarque: La valeur des constantes ci-dessus se trouve dans la clé API API Merchant Secure.
Quelques méthodes d'outil: Obtenez l'adresse IP, convertissez le tableau d'octets en chaîne hexadécimale, convertissez l'octet en chaîne hexadécimale
/ ** * Convertir le tableau d'octets en chaîne hexadécimale * * @param bytearray * @return * / public static static bytetoStr (byte [] bytearray) {string strdigest = ""; ) {strdigest + = bytetohexstr (bytearray [i]);} return strdigest; Numérique = {'', '', ',' ',' ',' ',' ',' ',' ',' ',', '', '', ',' ',' '' , '', '', '', 'A', 'b', 'c', 'd', 'e', 'f'}; char [] temparr = new Char []; [(octets >>>) & xf]; * / public static static getipaddr (httpsservlere request) {inetAddress addr = null; (); iPaddrstr;} De cette façon, la signature est obtenue, et la signature et d'autres données dans PayInfo sont converties en format XML et transmises à l'adresse unique unifiée sous forme de paramètres.
PayInfo Pi = Pu.CreatePayInfo (bo, "...", ""); String Sign = Pu.getSign (PI);
Objection à XML
/ ** * Extendez Xstream pour prendre en charge CDATA * / Private Static Xstream xstream = new XStream (new XPPDriver () {public HierarchicalStreamWriter CreateWriter (Writer Out) {re Turn New PrettrintWriter (Out) {// Ajouter CDATA Tag Boolean CDATA = true; @SuppressWarnings ("RawTypes") public void startNode (String Name, class Clazz) {super.startNode (name, Clazz);} Protected void writeText (Quic Kwriter Writer, String Text) {if (cdata) {writer.write (" <! [Cdata ["); writer.write (text); writer.write ("]]> ");} else {writer.write (texte);}}}};}}); chaîne statique publique PayInfotoxMl ( Payin fo PI) {xstream.alias ("xml", pi.getClass ();XML pour mapper
@SuppressWarnings ("Unchecked") Public Static Map <String, String> parsexml (String xml) lance l'exception {map <string, string> map = new Hashmap <st ring, string> (); ); } Ce qui suit est l'URL pour appeler l'ordre unifié
log.info (messageutil.payinfotoxml (pi) .replace ("__", "_")); Pay / UnifiedOrder "," Post ", MessageUtil.payinfotoxml (PI) .replace (" __ "," _ "). Remplace (" <! [CDATA ["," ") .replace ("]]> "," ")); log.info (map); public static map <string, string> httpsRequestToxml (string requestUrl, string requestMethod Buffer = httpsRequest (requestUrl, requestMethod, outputstr); Catch (exception e) {Log.Error ("Https Request Exception:" + ece.getMessage ());} Retour Résultat; La méthode httpsRequest () est dans le premier article
Si la carte obtenue ci-dessus réussit, il y aura
String return_code = map.get ("return_code"); return_msg) &&! return_msg.equals ("ok")) {return "Unified Single Error!";} else {return "Unified Single Error!";Ce prépaiement_id est l'ID de prépaiement. Payer plus tard l'exige.