El artículo anterior ha obtenido el OpenID del usuario
Este artículo llama principalmente a la API única unificada para el pago público de WeChat
Dirección API: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
Mirando el documento, el proceso principal es encapsular unos 20 parámetros en formato XML y enviarlos a la dirección de la interfaz dada por WeChat, y luego puede obtener el contenido devuelto. pago.
Los parámetros de solicitud no se explicarán.
Entre ellos, cadena aleatoria: usé uuid para dibujar la línea media
public static string create_nonce_str () {return uuid.randomuuid (). toString (). reemplazar ("-", ");Número de pedido comercial: cada número de pedido solo se puede usar una vez, por lo que se utiliza la marca de tiempo agregada al número de pedido del sistema.
Cantidad total: no puede ser
Dirección de notificación: la dirección de la devolución de llamada al sistema después del pago exitoso o fallido de WeChat
firmar:
importar java.io.serializable; String privado out_trade_no; Número de pedido comercial del sistema BizORDER en * @param IP Dirección IP del usuario * @Param OpenID User OpenID * @return */ public payInfo CreatePayInfo (bizorder bizorder, string ip, string openID) {payInfo payInfo = new PayInfo (); Constants.appid); Aquí está el cuerpo de un arroz blanco "); payInfo.setattach (bizorder.getId ()); payInfo.setOut_trade_no (bizorder.getOrderCode (). Concat (" A "). Concat (dateFormatUtilss. para Mat (nueva fecha ()) , "MMDDHHMMSS")); (OpenID);Obtenga la firma:
/ ** * Obtener firma * @param payInfo * @return * @throws excepción */ public string getSign (payInfo payInfo) lanza excepción {string firmp = "appid ="+payInfo.getAppid ()+"& adjunto ="+payInfo. getattach () +"& body =" +payInfo.getBody () +"& dispositivo_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. ); Nota: Las constantes anteriores. El valor de Key está en la clave API segura de la API comerciante.
Algunos métodos de herramienta: obtenga la dirección IP, convierta la matriz de bytes en cadena hexadecimal, convierta el byte en cadena hexadecimal
/ ** * Convertir la matriz de byte a hexadecimal string * * @param bytearray * @return */ public static string bytetostr (byte [] bytearray) {string strdigest = ""; ) {strdigest += bytetohexstr (bytearray [i]); Dígito = {'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '' , '', '', ',' A ',' b ',' c ',' d ',' e ',' f '}; [(bytes >>>) y xf]; */ public String static getIpAddr (httpservletre misión de misión) {inetaddress adr = null; (); ipaddrstr; De esta manera, se obtiene la firma, y la firma y otros datos en PayInfo se convierten en formato XML y se pasan a la dirección única unificada como parámetros.
PayInfo Pi = PU.CreatePayInfo (Bo, "...", "");
Objeto a XML
/** * Extender xStream para admitir cdata */private static xstream xstream = new xStream (new XPPDriver () {public HerarchicalStreamWriter CreateWriter (Writer Out) {re Turn New PrettyPrintWriter (Out) {// Agregar cdata boolean cdata = true; @SupessWarnings ("RawTypes") public void startnode (name de cadena, class clazz) {super.startnode (name, clazz); < Payin fo pi) {xstream.alias ("xml", pi.getClass ());XML para mapear
@SupessWarnings ("Unchecked") public static Map <String, String> parsexml (string xml) lanza la excepción {map <string, string> map = new Hashmap <st ring, string> (); ); } La siguiente es la URL para llamar al orden unificado
log.info (MessageUtil.PayInfotoxml (PI) .replace ("__", "_")); Pay/UnifiedOrder "," Post ", MessageUtil.PayInfotoxml (Pi) .replace (" __ "," _ "). Reemplazar (" <! [CDATA [",") .replace ("]>", "," "))); log.info (map); public static map <String, String> httpsRequestToxml (String requestUrl, string requestMethod, string outputStr) {map <string, string> resultado = new Hashmap <> (); intento {stringBuffer buffer = httpsRequest (request, requestmethod, outputStr); Catch (excepción e) {log.error ("HTTPS Solicitud de excepción:"+ECE.GetMessage ()); El método httpsRequest () está en el primer artículo
Si el mapa obtenido anteriormente tiene éxito, habrá
String return_code = map.get ("return_code"); return_msg) &&! return_msg.equals ("ok")) {return "Unified único error!";Este prepago_id es la ID de prepago. Pagar más tarde lo requiere.