Se plaignons:
L'interface de la démo et des documents d'Alipay et WeChat est vraiment trop difficile à comprendre. C'est désordonné et je ne sais pas où trouver ce que je veux. Ces derniers jours, notre entreprise doit faire des développements similaires. En tant que pionnier, j'ai pris l'initiative de résoudre le problème de l'intégration des interfaces de paiement Java Alipay et de paiement WeChat.
Notre environnement de travail: site Web JSP + interface de paiement. L'interface Alipay actuelle est 20160912 et WeChat est la version V3. Si vous rencontrez une mise à niveau de version, veuillez contacter le personnel du service à la clientèle de l'organisation concernée pour la mise à niveau.
Cet article présente l'interface JSP + Alipay, qui n'est pas originale.
Soyez conscient des débutants:
1. L'adresse d'interface et les paramètres utilisés dans cet article sont l'adresse du bac à sable. Que vous utilisiez le bac à sable ou l'adresse officielle, assurez-vous de vérifier l'utilisation de l'adresse et des paramètres de l'interface, et ne le prenez pas pour acquis.
2. Cet article utilise un package JAR:
Alipay-Sdk-Java20160912220103.jar
Commons-codec-1.6.jar
Commons-httpclient-3.0.1.jar
Commons-Logging-1.1.1.jar
fastjson-1.2.7.jar
JSON-LIB-2.2.3-JDK13.jar
json.jar
jsp-api.jar
servlet-api.jar
illustrer:
Alipay-Sdk-Java est le SDK de paiement officiel. Veuillez le télécharger sur le site officiel. Cet article utilise la version 20160912
Page d'accueil Appel:
<body> <% cspay pay = new CSpay (); Pay.dopost (demande, réponse); %> </body>
Package com.luozhuang.alipay; import java.util.hashmap; importation java.util.map; import com.alibaba.fastjson.json; import com.alipay.api.alipayapiexception; import com.alipay.api.alipayclient; import com.alipay.api.defaultalipayClient; import com.alipay.api.internal.util.stringutils; import com.alipay.api.request.alipaytradecancelRequest; import com.alipay.api.request.alipaytradepayRequest; Importer com.alipay.api.request.alipaytradepremereaQuest; import com.alipay.api.request.alipayTradeQueryRequest; import com.alipay.api.request.alipaytraderefundequest; import com.alipay.api.request.alipaytradewappayrequest; import com.alipay.api.response.alipaytradecancelResponse; import com.alipay.api.response.alipaytradepayResponse; Importer com.alipay.api.response.alipaytradeprereateponse; import com.alipay.api.response.alipayTradeReryResponse; import com.alipay.api.response.alipaytraderefundResponse; classe publique AlipayClientFactory {private static final alipayClient client = new defAftaulalipayClient (config.url, config.appid, config.rsa_rrivate_key, config.format, config.charset, config.alipay_public_key); public static alipayClient getalipayClientInstance () {return client; } / ** * AppAuthToken * Si ISV appelle l'interface de paiement en face à face au lieu du marchand, l'App_auth_token obtenu après l'autorisation du marchand doit être apporté avec lui; Si le marchand demande le paiement en face à face, il passera Null BizContent * Demande Paramètres de JSON Format Merchant * / // Mobile Web Payment Web Paiement Public String Ydandpc_pay (Map <String, String> Maps) lance Alipayapiexception {AlipayTradewappayRequest;); String notifyUrl = maps.get ("notifyurl"); String returnUrl = maps.get ("returnUrl"); // Rappel arrière if (! StringUtils.isempty (notifyUrl)) {AlipayRequest.SetNotifyUrl (notifyUrl); // Public Paramet Maps.Remove ("NotifyUrl"); // BizContent ne nécessite pas le paramètre public maps.remove ("notifyurl"); } // rappel de page if (! StringUtils.isempty (returnUrl)) {AlipayRequest.SetReturnUrl (returnUrl); // Public Paramet Maps.Remove ("returnUrl"); } String bizCon = JSON.TojSontring (Maps); AlipayRequest.SetBizContent (BizCon); String form = ""; essayez {form = alipayClientFactory.getAlipayClientInstance () .PageExEcute (AlipayRequest) .getBody (); } catch (alipayapiexception e) {form = "err"; e.printStackTrace (); } // Appelez le SDK pour générer un formulaire de retour de formulaire; } // Requête le statut de commande publique AlipayTradeQueryResponse Query (String AppAuthToken, String BizContent) lance AlipayApiexception {AlipayTradeQueryRequest Request = new AlipayTradeReryRequest (); request.putotherTextParam ("app_auth_token", appauthToken); request.setBizContent (bizcontent); return AlipayClientFactory.getAlipayClientInstance (). Exécuter (demande); } // Barcode Payment public AlipayTradePayResponse Pay (String AppAuthToken, String BizContent) lève AlipayApiexception {AlipayTradePayRequest request = new AlipayTraDepayRequest (); request.putotherTextParam ("app_auth_token", appauthToken); request.setBizContent (bizcontent); return AlipayClientFactory.getAlipayClientInstance (). Exécuter (demande); } // Scannez le code pour payer public AlipayTradePreaterSpason Prereat (String AppAuthToken, String BizContent) lève AlipayApiexception {AlipayTradePrecreAreEQuest Request = new AlipayTradePrecreAreEQuest (); request.putotherTextParam ("app_auth_token", appauthToken); request.setBizContent (bizcontent); return AlipayClientFactory.getAlipayClientInstance (). Exécuter (demande); } // Commandez révocation publique AlipayTradecancelResponse Annuler (chaîne appauthToken, String BizContent) lance AlipayApiexception {AlipayTraDeCancelRequest request = new AlipayTradecancelRequest (); request.putotherTextParam ("app_auth_token", appauthToken); request.setBizContent (bizcontent); return AlipayClientFactory.getAlipayClientInstance (). Exécuter (demande); } // Postuler pour un remboursement public AlipayTradereFundResponse Refund (String AppAuthToken, String BizContent) lance AlipayApiexception {AlipayTradeReFunDrequest Request = new AlipayTradeReFundeQuest (); request.putotherTextParam ("app_auth_token", appauthToken); request.setBizContent (bizcontent); return AlipayClientFactory.getAlipayClientInstance (). Exécuter (demande); } @SuppressWarnings ("inutilisé") public static void main (String [] args) {AlipayClientFactory c = new AlipayClientFactory (); try {map <string, string> map = new hashmap <string, string> (); map.put ("out_trade_no", "20160914113218"); String BizContent = JSON.TojSontring (Map); System.err.println (bizcontent); AlipayTradeQueryResponse RP = C.Query (null, bizContent); } catch (alipayapiexception e) {e.printStackTrace (); }}} Package com.luozhuang.alipay; Classe publique Config {// Developer applique une clé privée. Java configure le format PKCS8 et le langage PHP / .NET configure la clé privée d'origine dans le fichier RSA_PRIVATE_KEY.PEM. chaîne finale statique publique RSA_RRIVATE_KEY = "LUOZHUANG"; // Interface demande la passerelle. Les interfaces de paiement, de requête, de remboursement et de révocation en personne sont des valeurs fixes de chaîne finale statique publique Url = "https://openapi.alipaydev.com/gateway.do"; // Application marchande de l'application, tant que votre application contient l'interface de paiement Face pour la personne et est à l'état d'activation, vous pouvez utiliser l'apprid correspondant de cette application. Les développeurs peuvent se connecter à l'application liée au centre de gestion de plate-forme ouverte pour afficher la chaîne finale statique publique appid = "Luozhuang"; // jeu de caractères codé. Par défaut utf-8 public static final string charset = "utf-8"; // Renvoie le format. Par défaut json public static final string format = "json"; // La clé publique Alipay est utilisée pour obtenir des informations de retour synchrones pour la vérification afin de vérifier si ce sont les informations envoyées par Alipay. chaîne finale statique publique alipay_public_key = "Luozhuang"; } Package com.luozhuang.alipay; Importer java.io.ioException; import java.util.hashmap; importation java.util.map; Importer javax.servlet.servletException; import javax.servlet.http.httpservlet; Importer javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; import com.alipay.api.alipayapiexception; / ** * Classe d'implémentation de servlet CSpay * / public class CSpay étend httpServlet {private static final long SerialVersionUID = 1l; / ** * @see httpservlet # doget (httpservletRequest request, httpservletResponse * réponse) * / public void doget (httpservletRequest request, httpservletResponse réponse) lance Servlexception, ioException {dopost (demande, réponse); } / ** * @see httpServlet # doPost (httpsservletRequest request, httpservletResponse * Response) * / public void doPost (httpservletRequest, httpservletResponse réponse) lance ServletException, ioException {// les paramètres sont actuellement écrits et écrits vivants selon les besoins en affaires. Hashmap <string, string> (); maps.put ("out_trade_no", utildate.getOrderNum ()); maps.put ("total_amount", "0,01"); maps.put ("Sujet", "iPhone6 16G"); maps.put ("Body", "iPhone6 16G"); maps.put ("product_code", "Quick_wap_pay"); // La clé des deux paramètres suivants ne doit pas être écrite au hasard avec Maps.put ("returnUrl", "http://domain.com/callback/return_url.jsp"); maps.put ("notifyurl", "http://domain.com/callback/notify_url.jsp"); essayez {AlipayClientFactory ali = new AlipayClientFactory (); String form = ali.ydandpc_pay (maps); if (! form.equals ("err")) {réponse.setContentType ("text / html; charset = utf-8"); Response.getWriter (). Write (form); // Sortie directement le formulaire complet HTML à la page Response.getWriter (). Flush (); }} catch (alipayapiexception e) {e.printStackTrace (); }}} Package com.luozhuang.alipay; import java.util.arraylist; Importer java.util.collections; Importer java.util.list; importation java.util.map; Classe publique CSUtil {/ ** * Triez tous les éléments du tableau et les épissez en chaînes dans le groupe de paramètres "Paramètre = Paramètre" Pamor * @param Params * Paramètre qui doit être trié et participé à des caractères épisser * @return String après épissage * / keys static = new New ArrayList <string> (params.KeySet ()); Collection.Sort (clés); String prestr = ""; for (int i = 0; i <keys.size (); i ++) {string key = keys.get (i); String Value = Params.get (clé); if (i == keys.size () - 1) {// Lors de l'épissage, le dernier et le caractère n'est pas inclus Prestr = prestr + key + "=" + value; } else {prestr = prestr + key + "=" + value + "&"; }} return prostr; }} Package com.luozhuang.alipay; Importer java.util.date; import java.util.random; import java.text.simpledateFormat; import java.text.dateformat; / * * * Nom de la classe: Utilisation * Fonction: Classe de commande personnalisée * Détails: Classe d'outils, qui peut être utilisée pour obtenir des dates système, des numéros de commande, etc. * Version: 3.3 * Date: 2012-08-17 * Description: * Le code suivant n'est qu'un exemple de code fourni pour la commodité pour les tests marchands. Les commerçants peuvent écrire en fonction des besoins de leur propre site Web et selon des documents techniques, et il n'est pas nécessaire d'utiliser ce code. * Ce code est pour l'apprentissage et la recherche de l'interface Alipay uniquement et n'est fourni qu'en référence. * / Utilisation de la classe publique {/ ** année, mois, jour, heure, minute et deuxième (pas de soulignement) yyymmddhhmmss * / public statique final String dtlong = "yyymmddhhmmss"; / ** Temps plein Yyyy-mm-dd HH: mm: ss * / public static final String Simple = "yyyy-mm-dd hh: mm: ss"; / ** année, mois, jour, (pas de soulignement) yyyymmdd * / public statique final statique dtshort = "yyyymmdd"; / ** * Renvoie l'heure actuelle du système (précis à des millisecondes), en tant que numéro de commande unique * @return * Heure du système actuel dans le format YyyyMMDDHHMMS * / String statique public GetOrderNum () {Date Date = new Date (); DateFormat df = new SimpledateFormat (dtlong); return df.format (date); } / ** * Obtenez la date actuelle du système (précis aux millisecondes), format: yyyy-mm-dd hh: mm: ss * @return * / public static static getDateFormatter () {date date = new Date (); DateFormat df = new SimpledateFormat (Simple); return df.format (date); } / ** * Obtenez l'année en cours, mois, jour du système (exact jusqu'au jour), format: yyyymmdd * @return * / public static static getDate () {date date = new Date (); DateFormat df = new SimpledateFormat (dtshort); return df.format (date); } / ** * Générez un numéro aléatoire à trois chiffres * @return * / public static String getTheRe () {Random Rad = new Random (); return rad.nextint (1000) + ""; }}Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.