O artigo anterior obteve o usuário OpenId
Este artigo chama principalmente a API única unificada para pagamento público do WeChat
Endereço da API: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
Olhando para o documento, o processo principal é encapsular cerca de 20 parâmetros no formato XML e enviá -los para o endereço da interface fornecido pelo WeChat e, em seguida, você poderá obter o conteúdo retornado. pagamento.
Os parâmetros de solicitação não serão explicados.
Entre eles, string aleatória: usei UUID para desenhar a linha do meio
public static string create_nonce_str () {return uuid.randomuuid (). tostring (). substituir ("-", "");Número do pedido do comerciante: Cada número de pedido só pode ser usado uma vez, portanto, o carimbo de data e hora adicionado ao número do pedido do sistema é usado.
Valor total: não pode ser
Endereço de notificação: o endereço do retorno de chamada para o sistema após o pagamento bem -sucedido ou falhado no WeChat
sinal:
Importar Java.io.Serializable; String privada Out_trade_No; Número do pedido de negócios do sistema Bizorder em * @param ip user do usuário * @param OpenId OpenId * @return */ public PayInfo CreatePayinfo (Bizorder Bizorder, String IP, String OpenId) {Payinfo Payinfo = new Payinfo (); Constants.Appid); Aqui está o corpo de algum arroz branco "); payinfo.setattach (bizorder.getid ()); payinfo.setout_trade_no (bizorder.getorderCode (). Concat (" a "). Concat (dateformatutils. para mat (new date () , "Mmddhhmms")); (OpenId);Obtenha a assinatura:
/ ** * Obtenha assinatura * @param payinfo * @return * @throws Exceção */ public string getSign (PayInfo Payinfo) lança a exceção {string signetemp = "Appid ="+payInfo.GETAPPID ()+"& ANCHET ="+PayInfo. getAtTach () +"& body =" +payinfo.getbody () +"& device_info =" +payinfo.getDevice_info () +"& mch_id =" +payinfo.getmch_id () +"& nãoc e_str =" +payinfo.getNence_str () ¬ Ify_url = "+payinfo.getnotify_url ()+" & openId = "+payinfo.getOpenid ()+" & out_trade_no = "+payinfo.getout_trade_no ()+" & spbill_ Create_ip = "+Payinfo.get_no Payinfo. ); Nota: as constantes acima.
Alguns métodos de ferramenta: obtenha o endereço IP, converta a matriz de bytes em string hexadecimal, converta o byte em string hexadecimal
/ ** * Converta a matriz de byte em string hexadecimal * * @param bytearray * @return */ public static string bytetostr (byte [] bytearray) {string strdigest = ""; ) {strdigest += bytetoHexstr (byteartray [i]); Digit = {'', '', '' ',' '', '' ',', ',' ',' '' ',' ',', ',', ',', ',', ',', '' '' '', '', '' ',' '', '', ',' ',', '', '' ',', 'do', ' , '' ',' ',' 'A', 'b', 'c', 'd', 'e', 'f'}; [Bytes >>>) e xf]; */ public static string getipaddr (httpServletre miss requer) {inetaddress addr = null; (); ipaddrstr; Dessa forma, a assinatura é obtida e a assinatura e outros dados no PayInfo são convertidos em formato XML e passados para o endereço único unificado como parâmetros.
Payinfo Pi = Pu.CreatePayinfo (BO, "...", "");
Objeta a XML
/** * Estenda o XStream para suportar CDATA */private estático xstream xStream = new XStream (new XppDriver () {public hierárquico hierárquico CreateWriter (writer out) {re transformando new prettyprintWriter (out) {// Adicione CData tag boolean CDATA = true; @Suppresswarnings ("rawtypes") public void startNode (nome da string, classe clazz) {super.startNode (nome, clazz); <! [CDATA ["); writer.write (text); writer.write ("]]> ");} else {writer.write (text);}}}};}}); public static string payinfotoxml ( Payin fo Pi) {xstream.alias ("xml", pi.getclass ();XML para mapear
@Suppresswarnings ("desmarcado") mapa estático public <string, string> parsexml (string xml) lança exceção {map <string, string> map = new hashmap <st ring, string> (); ); } A seguir, o URL chama a ordem unificada
log.info (messageutil.payinfotoxml (pi) .replace ("__", "_")); Pay/UnifiedOrder "," Post ", MessageUtil.PayInfotoxml (PI) .Rplace (" __ "," _ "). Substitua (" <! [CDATA ["," ") .replace ("]]> "," ")); log.info (map); mapa estático público <string, string> httpSRequestToxml (string requesturl, string requestmethod, string outputsttr) {map <string, strg> resultado = new hashmap <> (); try {stringbuffer buffer = httpsRequest (requesturl, requestmethod, output); Catch (Exceção e) {Log.error ("HTTPS Solicitação Exceção:"+ECE.getMessage ()); O método httpsRequest () está no primeiro artigo
Se o mapa obtido acima for bem -sucedido, haverá
String return_code = map.get ("return_code"); return_msg) &&! return_msg.equals ("ok")) {return "unified single error!";Este pré -pagamento_id é o ID do pré -pagamento. O pagamento mais tarde exige isso.