1. Pertama berlaku untuk pengembangan dan aplikasi di platform terbuka WeChat. WeChat Open Platform akan menghasilkan identifikasi unik aplikasi aplikasi. Karena keamanan pembayaran diperlukan, nama paket aplikasi pedagang dan tanda tangan aplikasi perlu terikat pada platform terbuka, dan pembayaran hanya dapat dimulai secara normal setelah mengaturnya.
2. Daftarkan appid (ini dapat ditempatkan di aplikasi proyek)
Paket JAR WeChat diperkenalkan ke dalam Proyek Aplikasi Pedagang. Sebelum menelepon API, Anda perlu mendaftarkan appid Anda dengan WeChat. Kodenya adalah sebagai berikut:
final IWXAPI msgapi = wxapifactory.createWxapi (konteks, null); // Daftarkan aplikasi ke weChat msgapi.registerapp ("wxd930ea5d5a258f4f"); 3. Hubungi API tunggal terpadu untuk menghasilkan pesanan prabayar. Setelah mendapatkan prepay_id, tandatangani parameter dan kirimkan ke aplikasi untuk memulai pembayaran.
contoh:
Nomor pesanan dalam kode berikut perlu dihasilkan di latar belakang
String url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; WXPrepost Post = wxPrepost baru (); POST.AppID = "Appid Anda"; Post.mch_id = "Nomor Pedagang Anda"; POST.NONCE_STR = stringutils.gennoncestr (); // string acak ** 1 post.body = "nama produk"; Post.Detail = "Deskripsi Produk"; Post.out_trade_no = out_trade_no; // Nomor pesanan pedagang ** 2 post.total_fee = "harga komoditas"; // unit ini dibagi menjadi post.spbill_create_ip = getLocalipaddress (); // alamat ip ** 3 post.notify_url = ""; // Ini adalah alamat URL untuk backend untuk menerima pemberitahuan pembayaran POSIFIKASI Hasil. post.sign = genpackagegn (post); // tanda tangan ** 4 Daftar <namevaluePair> firstSignParams = getFirstSignParams (post); String xml = ToxML (firstSignParams); Entitas String = NULL; coba {entitas = string baru (xml.getbytes (), "iso8859-1"); byte [] buf = util.httpppost (url, entitas); if (buf! = null) {string content = string baru (buf); Peta <string, string> peta = decodexml (konten); if (peta! = null) {// tanda tangan lagi (bidang yang berpartisipasi dalam tanda tangan adalah: appid mitraIdid prepayid noncestr timestamp paket) string appid = ""; String prepayid = ""; String noncestr = ""; untuk (map.entry <string, string> entri: map.entryset ()) {if ("appId" .equals (entry.getKey ())) {appid = entry.getValue (); } else if ("prepay_id" .equals (entry.getKey ())) {prepayid = entry.getValue (); } else if ("nonce_str" .equals (entry.getKey ()))) {noncestr = entry.getValue (); }} Log.d (tag, "run ::" + appid + "/" + prepayid + "/" + noncestr + "/"); String timestamp = string.ValueOf (gentimestamp ()); // OK dapatkan string tanda tangan sekunder SecondPackageSign = genseCondPackageSign (getSecondSignParams (appid, prepayid, noncestr, timestamp)); Payreq req = payreq baru (); req.appid = appid; req.partnerid = "nomor pedagang"; req.prepayid = prepayid; req.noncestr = noncestr; req.timestamp = timestamp; req.packagevalue = "tanda = wxpay"; req.sign = SecondPackageSign; req.extData = "data aplikasi"; // Opsional // System.out.println ("GenPackageIgn3:"+Post.getSign ()+"/"+SecondPackAffyIch); // Sebelum pembayaran, jika aplikasi tidak terdaftar di WeChat, Anda harus terlebih dahulu menghubungi IWXMSG.RegisterApp untuk mendaftarkan aplikasi ke WeChat MAPI.Sendreq (Req); Log.d (tag, "run:" + appId + "/" + prepayid + "/" + noncestr + "/" + timestamp + "/" + SecondPackageSign); }}} catch (Exception e) {} public static byte [] httppost (string url, string entitas) {if (url == null || url.length () == 0) {log.e (tag, "httppost, url is null"); kembali nol; } HttpClient httpClient = getNewHttpClient (); Httppost httppost = httpppost baru (url); coba {httppost.setEntity (stringEntity baru (entitas)); httppost.setheader ("terima", "aplikasi/json"); httppost.setHeader ("tipe konten", "aplikasi/json"); Httpresponse resp = httpclient.execute (httppost); if (resp.getStatusLine (). getStatusCode ()! = httpstatus.sc_ok) {log.e (tag, "httpget gagal, status kode =" + resp.getstatusLine (). getStatusCode ()); kembali nol; } return entityutils.tobyteArray (resp.getEntity ()); } catch (Exception e) {log.e (tag, "httppost Exception, e =" + e.getMessage ()); e.printstacktrace (); kembali nol; }} // Metode untuk mendapatkan string acak public string statis gennoncestr () {acak acak = acak baru (); return md5.getMessagedIgest (string.valueof (random.nextint (10000)). getBytes ()); } Private String ToxML (Daftar <namevaluePair> params) {StringBuilder SB = New StringBuilder (); SB.Append ("<xml>"); untuk (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 (); } peta publik <string, string> decodexml (string content) {coba {peta <string, string> xml = new HashMap <> (); Xmlpullparser parser = xml.newpullparser (); parser.setInput (stringReader baru (konten)); int event = parser.getEventType (); while (event! = xmlpullparser.end_document) {string nodename = parser.getName (); switch (event) {case xmlpullparser.start_document: break; case xmlpullparser.start_tag: if (! "xml" .equals (nodename)) {xml.put (nodename, parser.nexttext ()); } merusak; case xmlpullparser.end_tag: break; } event = parser.next (); } return xml; } catch (Exception e) {} return null; } @Nonnull Private List <namevaluePair> getFirstSignParams (WXPrepost Params) {List <namevaluepair> packageParams = new LinkedList <> (); packageParams.add (BasicNamevaluePair baru ("appid", "appid")); packageParams.add (BasicNamevaluePair baru ("tubuh", params.body)); packageParams.add (BasicNamevaluePair baru ("detail", params.detail)); packageParams.add (BasicNamevaluePair baru ("MCH_ID", "Nomor Pedagang")); packageParams.add (basicNamevaluePair baru ("nonce_str", params.nonce_str)); packageParams.add (basicNamevaluePair baru ("notify_url", params.notify_url)); packageParams.add (basicNamevaluePair baru ("out_trade_no", params.out_trade_no)); packageParams.add (BasicNamevaluePair baru ("spbill_create_ip", params.spbill_create_ip)); packageParams.add (BasicNamevaluePair baru ("total_fee", params.total_fee + "")); packageParams.add (BasicNamevaluePair baru ("trade_type", params.trade_type)); packageParams.add (BasicNamevaluePair baru ("tanda", params.sign)); mengembalikan packageParams; } kelas publik wxprepost {// parameter yang harus dibawa dengan string publik appid; // Aplikasi AppID Disetujui oleh WeChat Open Platform Public String MCH_ID; // Nomor Pedagang yang ditugaskan oleh WeChat Pay Public String NONCE_STR; // String acak, tidak lebih dari 32 digit. Algoritma generasi acak yang disarankan algoritma string public string; // tanda tangan, lihat Algoritma Generasi Tanda Tangan Badan Publik Publik; // Deskripsi Produk Format bidang transaksi sesuai dengan format berikut sesuai dengan skenario aplikasi yang berbeda: aplikasi - nama aplikasi yang perlu diteruskan ke pasar aplikasi - nama produk aktual, Tiantian aiying menghilangkan - gim recharge. string publik out_trade_no; // Nomor pesanan di dalam sistem pedagang, yang dapat berisi huruf dalam 32 karakter. Untuk instruksi lain, lihat nomor pesanan pedagang intr Total_fee publik; // Jumlah total pesanan dalam sen. Untuk detailnya, lihat Jumlah Pembayaran String publik spbill_create_ip; // string publik IP sebenarnya notify_url; // Alamat panggilan balik untuk menerima pemberitahuan weChat pembayaran asinkron, URL pemberitahuan harus berupa URL yang dapat diakses secara langsung dan tidak dapat membawa parameter. (Disediakan di latar belakang) Public String trade_type; // Jenis Pembayaran // Parameter yang tidak harus dibawa public string device_info; // Nomor Perangkat Terminal (Nomor Toko atau ID Perangkat Kasir), silakan lewati "Web" secara default; // detail nama produk string publik lampirkan; // Data tambahan, dikembalikan seperti dalam API kueri dan pemberitahuan pembayaran. Bidang ini terutama digunakan untuk data khusus pedagang yang membawa pesanan string publik feede_type; // Kode surat tiga digit yang sesuai dengan standar ISO 4217, RMB default: CNY, lihat Jenis Mata Uang untuk daftar nilai lainnya untuk detail // PUBLIK PUBLIK TIME_START; // Waktu generasi pesanan adalah yyyymmddhhmmss, seperti yang ditunjukkan pada tahun 20091225091010, seperti yang ditunjukkan pada tahun 20091225091010. Untuk detail lainnya, lihat aturan waktu // string publik time_expire; // Pesanan waktu kedaluwarsa, format adalah yyyymmddhhmmss, seperti yang ditunjukkan pada tahun 20091227091010 pada 9:10 pada tanggal 27 Desember 2009. Silakan merujuk ke aturan waktu untuk detail lainnya. Catatan: Interval waktu kedaluwarsa minimum harus lebih besar dari 5 menit. Public String Goods_tag; // Parameter tag produk, voucher atau diskon diskon. Untuk detailnya, silakan merujuk ke voucher atau diskon diskon. // string publik Limit_pay; // NO_CREDIT-Tentukan bahwa Anda tidak dapat menggunakan kartu kredit untuk membayar string publik 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 getSign () {return Sign; } public void setSign (string Sign) {this.sign = tanda; } public string getBody () {return body; } public void setBody (string body) {this.body = body; } string publik 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; } string publik 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 notify_url; } public void setNotify_URL (String notify_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 () {return detail; } public void setDetail (detail string) {this.detail = detail; } public string getAttach () {return lampiran; } public void setattach (string lampiran) {this.attach = lampirkan; } public String getFee_Type () {return feed_type; } public void setFee_Type (string feed_type) {this.fee_type = feede_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 goods_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; }}Parameter yang diberikan di sini dapat diperoleh oleh terminal seluler itu sendiri. Tentu saja, yang terbaik adalah memberi kami latar belakang untuk alasan keamanan.
Setelah pembayaran selesai, WeChat akan menelepon kembali WXPayEntryRyActivity. Saya tidak akan membahas detailnya di sini. Dokumen WeChat dengan jelas menyatakan hasil dari pembayaran WeChat yang dikembalikan di OnResp () dari WXPayEntryactivity (Catatan: Hasil ini tidak dapat menjadi hasil dari apakah kita membeli produk dengan sukses. Kita harus menggunakan panggilan balik WeChat ke Selat Taiwan dan kemudian kembali ke Selat Taiwan untuk memberi tahu kita hasil pembayaran).
if (resp.getType () == constantsapi.command_pay_by_wx) {int kode = resp.errcode; switch (kode) {case 0: log.d (tag, "onpayfinish, errcode =" + "pay Success"); // Setelah pembayaran WeChat berhasil, buka latar belakang, hasil pembayaran yang dikembalikan oleh latar belakang adalah dasarnya. // Ini adalah panggilan balik setelah pembayaran WeChat selesai. Berikut adalah permintaan latar belakang dan memintanya untuk memberi tahu kami apakah pembayaran berhasil. merusak; kasus -1: toast.maketext (ini, "bayar gagal 1", toast.length_short) .show (); Log.d (tag, "onpayfinish, errcode =" + "pay gagal 1"); menyelesaikan(); merusak; case -2: toast.maketext (ini, "pay cancel", toast.length_short) .show (); Log.d (tag, "onpayfinish, errcode =" + "pay cancel"); menyelesaikan(); merusak; default: // toast.maketext (ini, "pay gagal 2", toast.length_short) .show (); Log.d (tag, "onpayfinish, errcode =" + "pay gagal 2"); setResult (result_ok); menyelesaikan(); merusak; }}Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.