1. ก่อนอื่นใช้สำหรับการพัฒนาและแอปพลิเคชันบนแพลตฟอร์ม WeChat Open แพลตฟอร์ม WeChat Open จะสร้าง appid ประจำตัวที่ไม่ซ้ำกันของแอพ เนื่องจากจำเป็นต้องมีการรักษาความปลอดภัยการชำระเงินชื่อแพคเกจแอปพลิเคชันผู้ค้าและลายเซ็นแอปพลิเคชันจะต้องถูกผูกไว้บนแพลตฟอร์มเปิดและการชำระเงินสามารถเริ่มต้นได้ตามปกติหลังจากตั้งค่า
2. ลงทะเบียน AppID (สามารถวางไว้ในแอปพลิเคชันโครงการ)
แพ็คเกจ WeChat Jar ถูกนำเข้าสู่โครงการแอพ Merchant ก่อนโทรหา API คุณต้องลงทะเบียน appid ของคุณด้วย weChat รหัสมีดังนี้:
สุดท้าย iwxapi msgapi = wxapifactory.createwxapi (บริบท, null); // ลงทะเบียนแอพไปยัง weChat msgapi.registerapp ("WXD930EA5D5A258F4F"); 3. โทร API เดียวแบบครบวงจรเพื่อสร้างคำสั่งซื้อล่วงหน้า หลังจากได้รับ prepay_id ให้ลงชื่อเข้าใช้พารามิเตอร์และส่งไปยังแอพเพื่อเริ่มการชำระเงิน
ตัวอย่าง:
หมายเลขคำสั่งซื้อในรหัสต่อไปนี้จะต้องมีการสร้างในพื้นหลัง
string url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; wxPrepost post = new WxPrepost (); post.appid = "appid ของคุณ"; post.mch_id = "หมายเลขผู้ค้าของคุณ"; post.nonce_str = stringutils.gennoncestr (); // สตริงสุ่ม ** 1 post.body = "ชื่อผลิตภัณฑ์"; post.detail = "คำอธิบายผลิตภัณฑ์"; post.out_trade_no = out_trade_no; // หมายเลขคำสั่งซื้อของผู้ค้า ** 2 post.total_fee = "ราคาสินค้า"; // หน่วยแบ่งออกเป็น post.spbill_create_ip = getLocalipaddress (); // ที่อยู่ IP ** 3 post.notify_url = ""; // นี่คือที่อยู่ URL post.sign = genpackagesign (โพสต์); // ลายเซ็น ** 4 รายการ <namevaluePair> FirstSignParams = getFirstSignParams (โพสต์); สตริง xml = toxml (firstsignparams); string entity = null; ลอง {entity = สตริงใหม่ (xml.getBytes (), "iso8859-1"); ไบต์ [] buf = util.httppost (url, เอนทิตี); if (buf! = null) {string content = new String (buf); แผนที่ <สตริง, สตริง> แผนที่ = decodexml (เนื้อหา); if (map! = null) {// ลงชื่อเข้าใช้อีกครั้ง (ฟิลด์ที่เข้าร่วมในลายเซ็นคือ: AppId PartnerId prepayId noncestampamp แพ็คเกจ) สตริง appid = ""; สตริง prepayid = ""; สตริง noncestr = ""; สำหรับ (map.entry <string, string> รายการ: map.entryset ()) {ถ้า ("appid" .equals (entry.getKey ())) {aptid = entry.getValue (); } อื่นถ้า ("prepay_id" .equals (entry.getKey ())) {prepayId = entry.getValue (); } อื่นถ้า ("nonce_str" .equals (entry.getKey ()))) {nonCestr = entry.getValue (); }} log.d (แท็ก, "run::" + appid + "/" + prepayid + "/" + noncestr + "/"); String timestamp = string.valueof (gentimestamp ()); // ตกลงรับสตริงลายเซ็นรอง SecondPackagesIgn = GensecondPackagesIgn (getSecondsignparams (appid, prepayid, noncest, timestamp)); Payreq req = new PayReq (); req.appid = appid; req.partnerId = "หมายเลขผู้ค้า"; req.prepayid = prepayid; req.noncestr = noncestr; req.timestamp = timestamp; req.packageValue = "sign = wxPay"; req.sign = secondpackagesign; req.extData = "ข้อมูลแอป"; // เป็นทางเลือก // System.out.println ("GenPackagesign3:"+post.getSign ()+"/"+secondPackagesIgn); // ก่อนการชำระเงินหากแอปพลิเคชันไม่ได้ลงทะเบียนกับ WeChat คุณควรโทรหา iwxmsg.registerapp ก่อนที่จะลงทะเบียนแอปพลิเคชันไปยัง WeChat Mapi.Sendreq (REQ); log.d (แท็ก, "run:" + appid + "/" + prepayid + "/" + noncestr + "/" + timestamp + "/" + secondpackagesign); }}} catch (Exception E) {} สาธารณะคงที่สาธารณะ [] httppost (string url, string entity) {if (url == null || url.length () == 0) {log.e (แท็ก, "httppost, url คือ null"); คืนค่า null; } httpClient httpClient = getNewhttpClient (); httppost httppost = ใหม่ httppost (url); ลอง {httppost.setEntity (ใหม่ที่เข้มงวด (เอนทิตี)); httppost.setheader ("ยอมรับ", "แอปพลิเคชัน/json"); httppost.setheader ("ประเภทเนื้อหา", "แอปพลิเคชัน/json"); httpresponse resp = httpClient.execute (httppost); if (resp.getStatusline (). getStatusCode ()! = httpstatus.sc_ok) {log.e (แท็ก, "httpget ล้มเหลว, รหัสสถานะ =" + resp.getStatusline (). getStatusCode ()); คืนค่า null; } return entityutils.tobytearray (resp.getEntity ()); } catch (exception e) {log.e (แท็ก, "ข้อยกเว้น httppost, e =" + e.getMessage ()); E.PrintStackTrace (); คืนค่า null; - // เมธอดเพื่อรับสตริงแบบสุ่มสาธารณะสตริงคงที่ GennonCestr () {สุ่มสุ่ม = ใหม่สุ่ม (); return md5.getMessageDigest (string.valueof (random.nextint (10,000)). getBytes ()); - สตริงส่วนตัว toxml (รายการ <namevaluePair> params) {StringBuilder sb = new StringBuilder (); sb.append ("<xml>"); สำหรับ (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>"); ส่งคืน sb.toString (); - แผนที่สาธารณะ <สตริง, สตริง> decodexml (เนื้อหาสตริง) {ลอง {แผนที่ <สตริง, สตริง> xml = new hashmap <> (); XMLPULLPARSER PARSER = XML.NEWPULLPARSER (); parser.setInput (stringreader ใหม่ (เนื้อหา)); int event = parser.getEventType (); ในขณะที่ (เหตุการณ์! = xmlpullparser.end_document) {string nodename = parser.getName (); สวิตช์ (เหตุการณ์) {case xmlpullparser.start_document: break; กรณี XMLPULLPARSER.START_TAG: if (! "XML" .Equals (nodEname)) {xml.put (nodeName, parser.nextText ()); } หยุดพัก; กรณี xmlpullparser.end_tag: break; } event = parser.next (); } return xml; } catch (exception e) {} return null; - @nonnull List Private <NameValuePair> getFirstSignParams (wxPrepost params) {รายการ <NameValuePair> packageParams = new LinkedList <> (); PackageParams.add (ใหม่ BasicAnmeValuePair ("appid", "appid")); PackageParams.add (ใหม่ BasicNameValuePair ("body", params.body)); PackageParams.add (ใหม่ BasicAnmeValuePair ("รายละเอียด", params.detail)); PackageParams.add (ใหม่ BasicNameValuePair ("MCH_ID", "Number Number")); PackageParams.add (ใหม่ BasicNameValuePair ("nonce_str", params.nonce_str)); PackageParams.add (ใหม่ BasicNameValuePair ("NOTIFY_URL", params.notify_url)); PackageParams.add (ใหม่ BasicNameValuePair ("out_trade_no", params.out_trade_no)); PackageParams.add (ใหม่ BasicNameValuePair ("spbill_create_ip", params.spbill_create_ip)); PackageParams.add (ใหม่ BasicNameValuePair ("total_fee", params.total_fee + "")); PackageParams.add (ใหม่ BasicNameValuePair ("trade_type", params.trade_type)); PackageParams.add (ใหม่ BasicNameValuePair ("Sign", params.sign)); ส่งคืนแพ็กเกจ - คลาสสาธารณะ wxprepost {// พารามิเตอร์ที่ต้องนำมาพร้อมกับสตริงสาธารณะ appid; // แอปพลิเคชัน AppID ได้รับการอนุมัติโดย WeChat Platform Public Public String MCH_ID; // หมายเลขผู้ค้าที่ได้รับมอบหมายโดย WeChat Pay String Public Nonce_str; // สตริงสุ่มไม่เกิน 32 หลัก อัลกอริทึมการสร้างตัวเลขสุ่มที่แนะนำ // ลายเซ็นดูอัลกอริทึมการสร้างลายเซ็นต์สาธารณะ // คำอธิบายผลิตภัณฑ์รูปแบบฟิลด์ธุรกรรมเป็นไปตามรูปแบบต่อไปนี้ตามสถานการณ์แอปพลิเคชันที่แตกต่างกัน: แอพ - ชื่อแอพที่ต้องส่งผ่านไปยังตลาดแอปพลิเคชัน - ชื่อผลิตภัณฑ์จริง, Tiantian Aiying กำจัด - การเติมเกม สตริงสาธารณะ out_trade_no; // หมายเลขคำสั่งซื้อภายในระบบการค้าซึ่งสามารถมีตัวอักษรภายใน 32 อักขระ สำหรับคำแนะนำอื่น ๆ ดูหมายเลขคำสั่งซื้อของผู้ค้าสาธารณะ int total_fee; // จำนวนคำสั่งซื้อทั้งหมดอยู่ใน Cent สำหรับรายละเอียดดูจำนวนเงินชำระเงินสาธารณะสตริง spbill_create_ip; // สตริงสาธารณะ IP จริง Notify_url; // ที่อยู่การโทรกลับสำหรับการรับการแจ้งเตือนแบบอะซิงโครนัส WeChat, URL การแจ้งเตือนจะต้องเป็น URL ที่เข้าถึงได้โดยตรงและไม่สามารถพกพาพารามิเตอร์ได้ (ให้ไว้ในพื้นหลัง) String Public String_type; // ประเภทการชำระเงิน // พารามิเตอร์ที่ไม่จำเป็นต้องดำเนินการสาธารณะสตริงอุปกรณ์สาธารณะ _info; // หมายเลขอุปกรณ์เทอร์มินัล (หมายเลขร้านค้าหรือรหัสอุปกรณ์แคชเชียร์) โปรดส่ง "เว็บ" โดยค่าเริ่มต้น; // ชื่อผลิตภัณฑ์รายละเอียดสตริงสาธารณะแนบ; // ข้อมูลเพิ่มเติมที่ส่งคืนเช่นใน API แบบสอบถามและการแจ้งเตือนการชำระเงิน ฟิลด์นี้ส่วนใหญ่จะใช้สำหรับข้อมูลที่กำหนดเองของพ่อค้าที่มีคำสั่งซื้อสตริงสาธารณะค่าธรรมเนียม FEE_TYPE; // รหัสตัวอักษรสามหลักที่สอดคล้องกับมาตรฐาน ISO 4217, ค่าเริ่มต้น RMB: CNY, ดูประเภทสกุลเงินสำหรับรายการค่าอื่น ๆ สำหรับรายละเอียด // สตริงสาธารณะ time_start; // เวลาการสร้างคำสั่งซื้อคือ yyyymmddhhmmss ดังที่แสดงในปี 20091225091010010 ดังที่แสดงในปี 20091225091010 สำหรับรายละเอียดอื่น ๆ ดูกฎเวลา // สตริงสาธารณะ time_expire; // เวลาหมดอายุการสั่งซื้อรูปแบบคือ yyyymmddhhmmss ดังที่แสดงในปี 20091227091010 เวลา 9:10 น. ของวันที่ 27 ธันวาคม 2552 โปรดดูกฎเวลาสำหรับรายละเอียดอื่น ๆ หมายเหตุ: ช่วงเวลาการหมดอายุขั้นต่ำจะต้องมากกว่า 5 นาที Public String Goods_tag; // พารามิเตอร์ของแท็กผลิตภัณฑ์บัตรกำนัลหรือส่วนลดส่วนลด สำหรับรายละเอียดโปรดดูบัตรกำนัลหรือส่วนลดส่วนลด // สตริงสาธารณะ limit_pay; // no_credit-บอกว่าคุณไม่สามารถใช้บัตรเครดิตเพื่อจ่ายสตริงสาธารณะ getAppid () {return appid; } โมฆะสาธารณะ setAppId (สตริง appid) {this.appid = appid; } สตริงสาธารณะ getMch_id () {return mch_id; } โมฆะสาธารณะ setmch_id (String mch_id) {this.mch_id = mch_id; } สตริงสาธารณะ getNonce_str () {return nonce_str; } โมฆะสาธารณะ setNonce_str (สตริง nonce_str) {this.nonce_str = nonce_str; } Public String getSign () {return sign; } โมฆะสาธารณะ setSign (เครื่องหมายสตริง) {this.sign = sign; } Public String getBody () {body return; } โมฆะสาธารณะ setbody (ตัวสตริง) {this.body = body; } สตริงสาธารณะ getOut_trade_no () {return out_trade_no; } โมฆะสาธารณะ setout_trade_no (สตริง out_trade_no) {this.out_trade_no = out_trade_no; } สาธารณะ int getTotal_fee () {return total_fee; } โมฆะสาธารณะ settotal_fee (int total_fee) {this.total_fee = total_fee; } สตริงสาธารณะ getSpbill_create_ip () {return spbill_create_ip; } โมฆะสาธารณะ setSpBill_Create_ip (String spbill_create_ip) {this.spbill_create_ip = spbill_create_ip; } สตริงสาธารณะ getNotify_url () {return notify_url; } โมฆะสาธารณะ setNotify_url (สตริง notify_url) {this.notify_url = notify_url; } สตริงสาธารณะ getTrade_type () {return trade_type; } โมฆะสาธารณะ settrade_type (String trade_type) {this.trade_type = trade_type; } สตริงสาธารณะ getDevice_info () {return device_info; } โมฆะสาธารณะ setDevice_info (String device_info) {this.device_info = device_info; } สตริงสาธารณะ getDetail () {รายละเอียดคืน; } โมฆะสาธารณะ setDetail (รายละเอียดสตริง) {this.detail = รายละเอียด; } สตริงสาธารณะ getattach () {return attach; } โมฆะสาธารณะ setattach (แนบสตริง) {this.attach = แนบ; } สตริงสาธารณะ getfee_type () {return feed_type; } โมฆะสาธารณะ setfee_type (สตริงค่าธรรมเนียม _type) {this.fee_type = feed_type; } สตริงสาธารณะ getTime_Start () {return time_start; } โมฆะสาธารณะ settime_start (String time_start) {this.time_start = time_start; } สตริงสาธารณะ getTime_expire () {return time_expire; } โมฆะสาธารณะ settime_expire (String time_expire) {this.time_expire = time_expire; } สตริงสาธารณะ getGoods_tag () {return goods_tag; } โมฆะสาธารณะ setGoods_tag (String goods_tag) {this.goods_tag = goods_tag; } สตริงสาธารณะ getLimit_pay () {return limit_pay; } โมฆะสาธารณะ setlimit_pay (String limit_pay) {this.limit_pay = limit_pay; -พารามิเตอร์ที่ให้ไว้ที่นี่สามารถรับได้โดยเทอร์มินัลมือถือเอง แน่นอนว่าเป็นการดีที่สุดที่จะให้พื้นหลังแก่เราด้วยเหตุผลด้านความปลอดภัย
หลังจากการชำระเงินเสร็จสิ้น WeChat จะโทรกลับ wxpayentryactivity ฉันจะไม่เข้าไปดูรายละเอียดที่นี่ เอกสาร WeChat ระบุอย่างชัดเจนถึงผลลัพธ์ของการชำระเงิน WeChat ที่ส่งคืนใน OnResp () ของ WxPayentRyActivity (หมายเหตุ: ผลลัพธ์นี้ไม่สามารถเป็นผลมาจากว่าเราซื้อผลิตภัณฑ์ได้สำเร็จหรือไม่เราต้องใช้ WeChat Callback ไปยังช่องแคบไต้หวัน
if (resp.getType () == Constantsapi.Command_pay_by_wx) {int code = resp.errcode; สวิตช์ (รหัส) {กรณี 0: log.d (แท็ก, "onpayfinish, errCode =" + "จ่ายสำเร็จ"); // หลังจากการชำระเงิน WeChat สำเร็จไปที่พื้นหลังผลการชำระเงินที่ส่งคืนโดยพื้นหลังเป็นพื้นฐาน // นี่คือการโทรกลับหลังจากการชำระเงิน WeChat เสร็จสมบูรณ์ นี่คือคำขอสำหรับพื้นหลังและขอให้เขาบอกเราว่าการชำระเงินสำเร็จหรือไม่ หยุดพัก; กรณี -1: toast.maketext (นี่, "จ่ายล้มเหลว 1", toast.length_short). show (); log.d (แท็ก, "onPayfinish, errCode =" + "การจ่ายล้มเหลว 1"); เสร็จ(); หยุดพัก; กรณี -2: toast.maketext (นี่, "จ่ายยกเลิก", toast.length_short) .show (); log.d (แท็ก, "onPayFinish, errCode =" + "pay cancel"); เสร็จ(); หยุดพัก; ค่าเริ่มต้น: // toast.maketext (นี่, "จ่ายล้มเหลว 2", toast.length_short). show (); log.d (แท็ก, "onpayfinish, errCode =" + "การจ่ายล้มเหลว 2"); setResult (result_ok); เสร็จ(); หยุดพัก; -ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น