1. Beantragen Sie zunächst die Entwicklung und Anwendung auf der WeChat Open -Plattform. Die WeChat Open -Plattform generiert die eindeutige Identifikationsanhilfe der App. Da die Zahlungssicherheit erforderlich ist, muss der Name der Händler -Bewerbungspaket und die Anwendungssignatur auf der offenen Plattform gebunden sein, und die Zahlung kann erst nach der Einrichtung normal eingeleitet werden.
2. Registrieren Sie den Appid (dies kann in der Projektanwendung platziert werden)
Das WeChat Jar -Paket wird in das Merchant App -Projekt eingeführt. Bevor Sie die API anrufen, müssen Sie Ihre Anhänger bei WeChat registrieren. Der Code ist wie folgt:
endgültig iwxapi msgapi = wxapifactory.createwxapi (Kontext, null); // Registrieren Sie die App an WeChat msgapi.registerApp ("wxd930ea5d5a258f4f"); 3. Rufen Sie die einheitliche einzelne API an, um eine Vorauszahlungsreihenfolge zu generieren. Suchen Sie nach Erhalt des Prepay_ID die Parameter und senden Sie sie an die App, um die Zahlung zu initiieren.
Beispiel:
Die Bestellnummer im folgenden Code muss im Hintergrund generiert werden
String url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; Wxprepost post = new WXprepost (); post.appid = "Ihr Appid"; post.mch_id = "Ihre Händlernummer"; post.nonce_str = Stringutils.gennoncestern (); // zufällige String ** 1 post.body = "Produktname"; post.detail = "Produktbeschreibung"; post.out_trade_no = out_trade_no; // Händlerbestellnummer ** 2 post.total_fee = "Commodity Price"; // Das Gerät ist in post.spbill_create_ip = getlocalipaddress (); // IP -Adresse ** 3 post.notify_url = "" // Dies ist die URL -Adresse für das Backend, um Zahlungsergebnisse zu akzeptieren. post.Sign = Genpackagesign (post); // Signature ** 4 LIST <NAMEVALUEPAIR> ERFTSIGNSIGNPARAMS = GETFIRSTSIGNPARAMS (post); String xml = toxml (FirstSignparams); String entity = null; try {entity = new String (xml.getBytes (), "ISO8859-1"); byte [] buf = util.httppost (URL, Entität); if (buf! = null) {string content = new String (buf); Karte <String, String> map = decodexml (Inhalt); if (map! = null) {// NOT Sign Sign (die an der Signatur teilnehmenden Felder sind: appid prepayid noncestern Timestamp -Paket) String appid = ""; String prepayid = ""; String noncest = ""; für (map.entry <String, String> Eintrag: map.EntrySet ()) {if ("appid" .equals (Eintrag.Getkey ())) {appid = Eintrag.getValue (); } else if ("prepay_id" .equals (Eintrag.Getkey ()) {prepayid = Eintrag.getValue (); } else if ("nonce_str" .equals (Eintrag.GeteKey ())) {noncestr = Eintrag.getValue (); }} Log.d (tag, "run ::" + appid + "/" + prepayid + "/" + noncestr + "/"); String timestamp = String.Valueof (gentimestamp ()); // OK den Secondary Signature String SecondPackagesign = GENSECONDPACKAGESIGN (GETECONDSIGNPARAMS (APPID, Prepayid, Noncestern, Timestamp)); PayReq req = neu PayReq (); req.appid = Appid; req.partnerid = "Händlernummer"; req.prepayid = prepayid; req.noncestern = noncestern; req.timestamp = timestamp; req.packageValue = "sign = wxpay"; req.sign = secondpackagesign; req.extData = "App -Daten"; // optional // system.out.println ("Genpackagesign3:"+post.getSign ()+"/"+Secondpackagesign); // Vor der Zahlung, wenn der Antrag nicht bei WeChat registriert ist, sollten Sie zunächst iwxmsg.registerApp anrufen, um den Antrag an WeChat Mapi.sendreq (REQ) zu registrieren. Log.d (tag, "run:" + appid + "/" + prepayid + "/" + noncest + "/" + timestamp + "/" + Secondpackagesign); }}} catch (Ausnahme e) {} public static byte [] httppost (String url, String entity) {if (url == null || url.length () == 0) {log.e (tag, "httppost, url is null"); null zurückkehren; } Httpclient httpclient = getNewhttpclient (); Httppost httppost = new httppost (URL); try {httppost.setEntity (neue strietentity (Entity)); httppost.setheader ("Akzeptieren", "Anwendung/JSON"); httppost.setheader ("Content-Typ", "Application/JSON"); Httpresponse resp = httpclient.execute (httppost); if (resp.getStatusLine (). getStatusCode ()! null zurückkehren; } returnentityutils.tobytearray (resp.getEntity ()); } catch (Ausnahme e) {log.e (tag, "httppost -Ausnahme, e =" + e.getMessage ()); E. printstacktrace (); null zurückkehren; }} // Methode zum Erhalten von zufälligen String öffentliche statische String gennoncestr () {random randal = new Random (); return md5.getMessagedigest (String.ValueOf (random.Nextint (10000)). getBytes ()); } private Zeichenfolge toxml (Liste <nameValuePair> Params) {StringBuilder sb = new StringBuilder (); sb.Append ("<xml>"); für (int i = 0; i <params.size (); i ++) {sb.append ("<" + params.get (i) .getName () + ">"); sb.Append (params.get (i) .getValue ()); sb.append ("</" + params.get (i) .getName () + ">"); } sb.append ("</xml>"); return sb.tostring (); } public map <string, string> decodexml (String -Inhalt) {try {map <string, string> xml = new HashMap <> (); XmlpullParser parser = xml.newpullPlparser (); parser.setInput (neuer StringReader (Inhalt)); int event = parser.getEventType (); while (Ereignis! Switch (Ereignis) {case xmlpullParser.start_document: break; case xmlpullParser.start_tag: if (! "xml" .equals (nodeName)) {xml.put (nodename, parser.nextText ()); } brechen; Fall xmlpullParser.end_tag: Break; } event = parser.next (); } return xml; } catch (Ausnahme e) {} return null; } @Nonnull private Liste <NameValuePair> getFirstSignParams (WXPrepost -Params) {Liste <NameValuePair> packageParams = new LinkedList <> (); packageParams.add (New BasicNamevaluePair ("Appid", "Appid")); packageParams.add (New BasicNamevaluePair ("Body", Params.body)); packageParams.add (New BasicNamevaluePair ("Detail", params.detail)); packageParams.add (New BasicNamevaluePair ("mch_id", "Händlernummer")); packageParams.add (new BasicNamevaluePair ("nonce_str", params.nonce_str)); packageParams.add (New BasicNamevaluePair ("Notify_url", params.notify_url)); packageParams.add (new BasicNamevaluePair ("out_trade_no", params.out_trade_no)); packageParams.add (new BasicNamevaluePair ("spbill_create_ip", params.spbill_create_ip)); packageParams.add (new BasicNamevaluePair ("Total_fee", params.total_fee + "")); packageParams.add (New BasicNamevaluePair ("Trade_Type", params.trade_type)); PackageParams.Add (New BasicNamevaluePair ("Zeichen", Params.Sign)); return packageParams; } öffentliche Klasse WXPrepost {// Die Parameter, die mit öffentlicher String -Appid mitgebracht werden müssen; // Anwendung Appid genehmigt von WeChat Open Plattform Public String mch_id; // Die von WeChat Pay pay pay String nonce_str zugewiesene Händlernummer; // zufällige Zeichenfolge, nicht länger als 32 Ziffern. Empfohlener Zufallszahlengenerierung Algorithmus öffentliches Zeichenfolgezeichen; // Signatur siehe den Signature -Generierungsalgorithmus öffentlicher String -Körper; // Produktbeschreibung Transaktionsfeldformat entspricht dem folgenden Format gemäß den verschiedenen Anwendungsszenarien: App - App -Name, der in den Anwendungsmarkt übergeben werden muss - Tatsächlicher Produktname, Tiantian AIying Eliminate - Game Lade. public string out_trade_no; // Die Bestellnummer im Händlersystem, die Buchstaben innerhalb von 32 Zeichen enthalten kann. Weitere Anweisungen finden Sie in der Händlerauftragsnummer public int Total_fee; // Der Gesamtauftragsbetrag liegt im Cent. Weitere Informationen finden Sie im Zahlungsbetrag öffentlicher String SPBILL_CREATE_IP; // Die tatsächliche IP -öffentliche String notify_url; // Die Rückrufadresse für den Empfang von asynchronen Benachrichtigungen von WeChat -Zahlungen muss die Benachrichtigungs -URL eine direkt zugängliche URL sein und keine Parameter tragen. (Im Hintergrund bereitgestellt) öffentlicher String Trade_Type; // Zahlungstyp // Parameter, die nicht verpflichtet werden müssen, öffentlich String Device_info zu tragen; // Terminal -Gerätenummer (Speichernummer oder Kassierer -Geräte -ID), bitte bestehen "Web" standardmäßig. // Produktname Details öffentliche Zeichenfolge anhängen; // Zusätzliche Daten, zurückgegeben wie in der Abfrage -API und der Zahlungsbenachrichtigung. Dieses Feld wird hauptsächlich für benutzerdefinierte Daten von Händlern verwendet, die Bestellungen für öffentliche String Fee_type tragen. // Drei-Grad-Briefcode, der dem ISO 4217-Standard entspricht, Standard-RMB: CNY finden Sie unter Währungstyp für andere Wertlisten für Details // Public String time_start; // Die Auftragsgenerierungszeit ist yjyymmddhmms, wie 20091225091010 gezeigt, wie 20091225091010 gezeigt. Weitere Details finden Sie in den Zeitregeln // öffentliche String time_expire; // Ablaufzeit bestellen, ist das Format Yyyymmddhmms, wie 20091227091010 am 27. Dezember 2009 um 9:10 Uhr gezeigt. Weitere Informationen finden Sie in den Zeitregeln. Hinweis: Das Zeitintervall des Mindestablaufzeit muss größer als 5 Minuten betragen. Public String goods_tag; // Parameter von Produkt -Tags, Gutscheinen oder Rabatten. Weitere Informationen finden Sie unter den Gutscheinen oder Rabatten. // public String limit_pay; // no_credit-geben Sie an, dass Sie keine Kreditkarte verwenden können, um die öffentliche Zeichenfolge zu bezahlen GetAppid () {return Appid; } public void setAppid (String appid) {this.appid = appid; } public String getMch_id () {return mch_id; } public void setmch_id (String mch_id) {this.mch_id = mch_id; } public String getnonce_str () {return nonce_str; } public void setNonce_str (string nonce_str) {this.nonce_str = nonce_str; } public String getSInnen () {Rückgabezeichen; } public void setSign (String Sign) {this.sign = Sign; } public String getBody () {return body; } public void setbody (String body) {this.body = body; } public String getout_trade_no () {return out_trade_no; } public void setout_trade_no (string out_trade_no) {this.out_trade_no = out_trade_no; } public int getTotal_fee () {return Total_fee; } public void settotal_fee (int total_fee) {this.total_fee = Total_fee; } public String getSpbill_create_ip () {return spbill_create_ip; } public void setSpbill_create_ip (string spbill_create_ip) {this.spbill_create_ip = spbill_create_ip; } public String getNotify_url () {return benocify_url; } public void setNotify_url (String benachrichtigen_url) {this.notify_url = notify_url; } public String getTrade_type () {return Trade_type; } public void settrade_type (String Trade_type) {this.trade_type = Trade_type; } public String getDevice_Info () {return device_info; } public void setDevice_info (String Device_Info) {this.device_info = device_info; } public String getDetail () {Rückgabedetail; } public void setDetail (String detail) {this.detail = detail; } public String getattach () {return atat; } public void setattach (String Attach) {this.attach = Attach; } public String getfee_type () {return fee_type; } public void setfee_type (String fee_type) {this.fee_type = fee_type; } public String getTime_start () {return time_start; } public void setTime_start (String time_start) {this.time_start = time_start; } public String getTime_expire () {return time_expire; } public void setTime_expire (String time_expire) {this.time_expire = time_expire; } public String getgoods_tag () {return Goods_Tag; } public void setgoods_tag (String Waren_tag) {this.goods_tag = goods_tag; } public String getLimit_pay () {return limit_pay; } public void setLimit_pay (string limit_pay) {this.limit_pay = limit_pay; }}Die hier angegebenen Parameter können vom mobilen Terminal selbst erhalten werden. Natürlich ist es am besten, uns aus Sicherheitsgründen den Hintergrund zu bieten.
Nach Abschluss der Zahlung ruft WeChat WXPayEntryActivity zurück. Ich werde hier nicht auf Details eingehen. Das WeChat -Dokument gibt eindeutig die Ergebnisse der WeChat -Zahlung an, die in der WXPayEntryActivity zurückgegeben wurden (Hinweis: Dieses Ergebnis kann nicht das Ergebnis sein, ob wir das Produkt erfolgreich kaufen. Wir müssen WeChat -Rückruf in die Taiwaner Strait verwenden und dann in die Taiwan -Straße zurückkehren, um das Zahlungsergebnis mitzuteilen).
if (resp.gettType () == constantantsapi.command_pay_by_wx) {int code = resp.errcode; Switch (Code) {Fall 0: log.d (Tag, "OnPayfinish, errcode =" + "Pay Success"); // Nach der erfolgreichen WeChat -Zahlung ist das vom Hintergrund zurückgegebene Zahlungsergebnis die Grundlage. // Dies ist der Rückruf nach Abschluss der WeChat -Zahlung. Hier ist eine Anfrage für den Hintergrund und bittet ihn, uns zu sagen, ob die Zahlung erfolgreich ist. brechen; Fall -1: toast.maketext (this, "Pay fehlgeschlagen 1", Toast.length_short) .show (); Log.d (Tag, "OnPayfinish, errcode =" + "Pay fehlgeschlagen 1"); beenden(); brechen; Fall -2: toast.makeText (this, "pay covorn", toast.length_short) .show (); Log.d (tag, "onpayfinish, errcode =" + "pay covast"); beenden(); brechen; Standard: // toast.makeText (this, "Pay fehlgeschlagen 2", toast.length_short) .show (); Log.d (Tag, "Onpayfinish, errcode =" + "Pay fehlgeschlagen 2"); setResult (result_ok); beenden(); brechen; }}Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.