Vamos a quejarnos:
La interfaz de la demostración y documentos de Alipay y WeChat es realmente demasiado difícil de entender. Es desordenado y no sé dónde encontrar lo que quiero. En los últimos días, nuestra empresa necesita hacer desarrollos similares. Como pionero, tomé la iniciativa para resolver el problema de integrar el pago de Java Alipay y las interfaces de pago WeChat.
Nuestro entorno de trabajo: sitio web de JSP + interfaz de pago. La interfaz Alipay actual es 20160912 y WeChat es la versión V3. Si se encuentra con una actualización de la versión, comuníquese con el personal de servicio al cliente de la organización relevante para actualizar.
Este artículo presenta la interfaz JSP+Alipay, que no es original.
Sea consciente de los novatos:
1. La dirección de la interfaz y los parámetros utilizados en este artículo son la dirección del sandbox. Ya sea que esté utilizando el sandbox o la dirección oficial, asegúrese de verificar el uso de la dirección de la interfaz y los parámetros, y no lo dé por sentado.
2. Este artículo usa el paquete 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
ilustrar:
Alipay-SDK-Java es el SDK de pago oficial. Descárgalo en el sitio web oficial. Este artículo utiliza la versión 20160912
Llamada de la página de inicio:
<body> <% cspay pay = new cspay (); pay.dopost (solicitud, respuesta); %> </body>
paquete com.luozhuang.alipay; import java.util.hashmap; import 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; import com.alipay.api.request.alipaytradeprecreaterquest; import com.alipay.api.request.alipaytradqueryRequest; import com.alipay.api.request.alipaytraderefundRequest; import com.alipay.api.request.alipaytradewappayRequest; import com.alipay.api.Response.alipayTradecancelResponse; import com.alipay.api.Response.alipaytradepayResponse; import com.alipay.api.Response.alipaytradepRecreaterSponse; import com.alipay.api.Response.alipaytradqueryResponse; import com.alipay.api.Response.alipayTraderefundResponse; clase pública AlipayClientFactory {private Static final AlipayClient Client = new DefaultAlIpayClient (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 llama a la interfaz de pago cara a cara en lugar del comerciante, el APP_Auth_Token obtenido después de que el comerciante sea autorizado debe ser traído con él; Si el comerciante solicita el pago cara a cara, pasará NULL BizContent * Parámetros de solicitud de JSON Format Merchant */ // Mobile Web Pague Sitio web Pague Cadena pública YDANDPC_PAY (map <string, string> maps) lanza alipayapiexception {alipayTradewappayRequest alipayRequest = newipaytradewappayReCeScest (););););););););););););););); Cadena notifyUrl = maps.get ("notifyUrl"); Cadena returnUrl = maps.get ("returnUrl"); // Backback Backback if (! StringUtils.isEmpty (notifyUrl)) {alipayRequest.setNotifyUrl (notifyUrl); // Public Parameter Maps.remove ("NotifyUrl"); // bizContent no requiere el parámetro público maps.remove ("notifyUrl"); } // Page Callback if (! StringUtils.isEmpty (returnUrl)) {alipayRequest.setReturnurl (returnUrl); // Public Parameter Maps.remove ("ReturnUrl"); } Cadena bizCon = json.tojSonstring (mapas); AlipayRequest.SetBizContent (bizCon); Cadena form = ""; Pruebe {form = AlipayClientFactory.getAlIpayClientInstance () .PageExecute (AlipayRequest) .getBody (); } catch (alipayapiexception e) {form = "err"; E.PrintStackTrace (); } // llame al SDK para generar un formulario de retorno de formulario; } // Consulta el estado de pedido public alipaytradeberyResponse Query (String AppAuthToken, String BizContent) arroja Alipayapiexception {AlipayTradeQueryRequest Request = New AlipayTraderyRequest (); request.putotherTextParam ("app_auth_token", appAuthToken); request.setBizContent (bizContent); return alipayClientFactory.getAlIpayClientInStance (). Execute (solicitud); } // pago de código de barras public alipaytradepayResponse pay (string appAuthToken, string bizContent) lanza Alipayapiexception {alipaytradepayRequest solicitud = nueva alipaytradepayRequest (); request.putotherTextParam ("app_auth_token", appAuthToken); request.setBizContent (bizContent); return alipayClientFactory.getAlIpayClientInStance (). Execute (solicitud); } // Escanear el código para pagar el público AlipaytradepRecreaterSponse PrecReate (String AppAuthToken, String BizContent) arroja Alipayapiexception {AlipayTradePreateReateChest request = nueva alipaytradePrecreaterEsteStest (); request.putotherTextParam ("app_auth_token", appAuthToken); request.setBizContent (bizContent); return alipayClientFactory.getAlIpayClientInStance (). Execute (solicitud); } // Revocación de orden public alipayTradeCancelResponse Cancel (String AppAuthToken, String BizContent) Lanza Alipayapiexception {AlipayTradeCancelRequest request = neipayTradeCancelRequest (); request.putotherTextParam ("app_auth_token", appAuthToken); request.setBizContent (bizContent); return alipayClientFactory.getAlIpayClientInStance (). Execute (solicitud); } // Solicite un reembolso public alipaytraderefundResponse reembolso (string appAuthToken, String bizContent) arroja AlipayapIException {AlipayTradereFundRequest Request = New AlipayTradeRefundRequest (); request.putotherTextParam ("app_auth_token", appAuthToken); request.setBizContent (bizContent); return alipayClientFactory.getAlIpayClientInStance (). Execute (solicitud); } @Suppleswarnings ("no usado") public static void main (string [] args) {AlipayClientFactory c = neipayClientFactory (); intente {map <string, string> map = new Hashmap <String, String> (); map.put ("out_trade_no", "20160914113218"); Cadena bizContent = json.tojSonstring (map); System.err.println (bizContent); AlipaytradeberyResponse rp = C.Query (nulo, bizContent); } Catch (Alipayapiexception e) {E.PrintStackTrace (); }}} paquete com.luozhuang.alipay; Configuración de clase pública {// El desarrollador aplica la clave privada. Java configura el formato PKCS8, y el lenguaje PHP/.NET configura la clave privada original en el archivo rsa_private_key.pem. cadena final estática pública RSA_RRIVATE_KEY = "LUOZHUANG"; // Interface Solic Gateway. El pago en persona, la consulta, el reembolso y las interfaces de revocación son valores fijos de la cadena final estática de cadena final = "https://openapi.alipaydev.com/gateway.do"; // Applicator de la aplicación comercial, siempre que su aplicación contenga la interfaz de pago de la persona facial y esté en el estado de activación, puede usar la aplicación correspondiente de esta aplicación. Los desarrolladores pueden iniciar sesión en la aplicación abierta relacionada con el centro de gestión de la plataforma para ver la cadena final estática pública AppID = "Luozhuang"; // Conjunto de caracteres codificado. Predeterminado UTF-8 public static final String Charset = "UTF-8"; // Devuelve formato. Predeterminado JSON public Public static final String format = "JSON"; // La clave pública de Alipay se utiliza para obtener información de retorno sincrónica para la verificación para verificar si es la información enviada por Alipay. Public static final String alipay_public_key = "Luozhuang"; } paquete com.luozhuang.alipay; import java.io.ioException; import java.util.hashmap; import java.util.map; import javax.servlet.servletException; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; import com.alipay.api.alipayapiexception; / ** * Clase de implementación de servlet CSPAY */ Public Class CSPay extiende httpservlet {private static final long SerialVersionUid = 1l; / ** * @see httpservlet#doget (httpservletRequest solicitud, httpServletResponse * respuesta) */ public void doget (httpservletRequest solicitud, respuesta httpServletResponse) lanza ServletException, ioexception {dopost (solicitud, respuesta); } / ** * @see httpservlet#dopost (httpservletRequest solicitud, httpServletResponse * respuesta) * / public void dopost (httpservletRequest request, htttpServletReSponse Respuesta) tira ServletException, ioException {// Los parámetros están escritos muertos y escritos en vivo según las necesidades de negocios. Hashmap <string, string> (); maps.put ("out_trade_no", utildrate.getOrderNum ()); maps.put ("Total_amount", "0.01"); maps.put ("sujeto", "iPhone6 16g"); maps.put ("cuerpo", "iPhone6 16g"); maps.put ("product_code", "Quick_wap_pay"); // La clave de los siguientes dos parámetros no debe escribirse aleatoriamente con Maps.put ("returnurl", "http://domain.com/callback/return_url.jsp"); maps.put ("notifyurl", "http://domain.com/callback/notify_url.jsp"); intente {AlipayClientFactory ali = new AlipayClientFactory (); Cadena form = Ali.ydandpc_pay (mapas); if (! form.equals ("err")) {Response.SetContentType ("Text/Html; Charset = UTF-8"); Response.getWriter (). Write (Form); // Salida directamente el formulario completo html a la página Response.getWriter (). Flush (); }} Catch (Alipayapiexception e) {E.PrintStackTrace (); }}} paquete com.luozhuang.alipay; import java.util.arrayList; import java.util.collections; import java.util.list; import java.util.map; clase pública CSUTIL { / ** * Ordena todos los elementos de la matriz y empapéizalos en cadenas en el grupo de parámetros "Parámetro = Valor de parámetro" * * @param Params * de parámetros que debe ordenarse y participar en la empalme de caracteres * @return string después de empalmar * / public static string createLinkstring (map <string> parámetros) ArrayList <String> (params.KeySet ()); Colección.sort (claves); Cadena prest = ""; for (int i = 0; i <keys.size (); i ++) {string key = keys.get (i); Valor de cadena = params.get (clave); if (i == keys.size () - 1) {// Al empalmar, el último y carácter no está incluido prestr = prest + key + "=" + valor; } else {prest = prest + key + "=" + valor + "&"; }} return prest; }} paquete com.luozhuang.alipay; import java.util.date; import java.util.random; import java.text.simpledateFormat; import java.text.dateformat; / * * * Nombre de la clase: Utililyado * Función: Class de pedido personalizado * Detalles: Clase de herramientas, que se puede usar para obtener fechas del sistema, números de pedido, etc. * Versión: 3.3 * Fecha: 2012-08-17 * Descripción: * El siguiente código es solo un código de muestra proporcionado para conveniencia para las pruebas de comerciante. Los comerciantes pueden escribir de acuerdo con las necesidades de su propio sitio web y de acuerdo con los documentos técnicos, y no es necesario usar este código. *Este código es para aprender e investigar solo la interfaz Alipay, y solo se proporciona como referencia. */ public class UdilDate {/ ** año, mes, día, hora, minuto y segundo (sin subrayamiento) yyymmddhhmmss*/ public static final String dtlong = "yyymmddhhmmss"; / ** Tiempo completo aaa yyyy-mm-dd HH: mm: ss*/ public static final string simple = "yyyy-mm-dd hh: mm: ss"; / ** Año, mes, día, (sin subrayador) aaaayymmdd*/ public static final string dtshort = "yyyymmdd"; / *** Devuelva la hora actual del sistema (precisa a milisegundos), como un número de pedido único* @return* Tiempo actual del sistema en yyyymmddhhmmss format*/ public static string getOrderNum () {date date = new date (); DateFormat df = new SimpleDateFormat (dtlong); return df.format (fecha); } / ** * Obtenga la fecha actual del sistema (preciso para milisegundos), formato: aaa yyyy-mm-dd hh: mm: ss * @return * / public static string getDateFormatter () {date date = new date (); DateFormat df = new SimpleDateFormat (simple); return df.format (fecha); } / ** * Obtenga el año actual, mes, día del sistema (preciso para el día), formato: yyyymmdd * @return * / public static string getDate () {date date = new Date (); DateFormat df = new SimpleDateFormat (dtShort); return df.format (fecha); } / *** Genere un número de tres dígitos aleatorio* @return* / public static string getThree () {Random rad = new Random (); return rad.nextint (1000)+""; }}Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.