1. التقدم أولاً بطلب للتطوير والتطبيق على منصة WeChat Open. ستقوم WeChat Open Platform بإنشاء تطبيق تعريف فريد للتطبيق. نظرًا لأن أمان الدفع مطلوب ، يجب ربط اسم حزمة التطبيق التاجر وتوقيع التطبيق على النظام الأساسي المفتوح ، ولا يمكن بدء الدفع إلا بشكل طبيعي بعد إعداده.
2. قم بتسجيل AppID (يمكن وضع هذا في تطبيق المشروع)
يتم تقديم حزمة WeChat Jar في مشروع تطبيق Merchant. قبل الاتصال بآبار واجهة برمجة التطبيقات ، تحتاج إلى تسجيل appid الخاص بك مع WeChat. الرمز كما يلي:
النهائي iwxapi msgapi = wxapifactory.createwxapi (السياق ، فارغ) ؛ // قم بتسجيل التطبيق على WeChat msgapi.registerapp ("WXD930A5D5A258F4F") ؛ 3. اتصل بأبواج واجهة برمجة التطبيقات الموحدة لإنشاء أمر الدفع المسبق. بعد الحصول على prepay_id ، قم بتوقيع المعلمات ونقلها إلى التطبيق لبدء الدفع.
مثال:
يجب إنشاء رقم الطلب في الكود التالي في الخلفية
String url = "https://api.mch.weixin.qq.com/pay/unifyedorder" ؛ wxprepost post = جديد wxprepost () ؛ post.appid = "appid الخاص بك" ؛ post.mch_id = "رقم التاجر الخاص بك" ؛ post.nonce_str = stringUtils.gennoncester () ؛ // string random ** 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 = "؛ post.sign = genpackagesign (post) ؛ // signature ** 4 list <MameValUepair> firstSignParams = getFirstSignParams (post) ؛ String xml = toxml (firstSignParams) ؛ كيان السلسلة = فارغ ؛ Try {entity = new String (xml.getbytes () ، "ISO8859-1") ؛ byte [] buf = util.httppost (url ، untity) ؛ if (buf! = null) {string content = new string (buf) ؛ الخريطة <string ، string> map = decodexml (content) ؛ if (map! = null) {// sign مرة أخرى (الحقول المشاركة في التوقيع هي: AppId PartnerId prepayid noncester timestamp package) سلسلة appid = "" ؛ سلسلة prepayid = "" ؛ سلسلة noncestr = "" ؛ لـ (map.entry <string ، string> inter: map.entryset ()) {if ("appid" .equals (entrate.getKey ())) {appid = interpl.getValue () ؛ } if if ("prepay_id" .equals (intrad.getKey ())) {prepayId = intpling.getValue () ؛ } آخر if ("nonce_str" .equals (intrad.getKey ())))) {noncestr = intpling.getValue () ؛ }} log.d (علامة ، "تشغيل::" + appid + "/" + prepayid + "/" + noncester + "/") ؛ سلسلة الطابع الزمني = string.valueof (gentimestamp ()) ؛ . payreq req = new payreq () ؛ req.appid = appid ؛ req.partnerid = "Merchant Number" ؛ req.prepayid = prepayid ؛ req.noncester = noncestr ؛ req.timestamp = timestamp ؛ req.packageValue = "sign = wxpay" ؛ req.sign = secondPackagesIgn ؛ req.extData = "App Data" ؛ // اختياري // system.out.println ("GenPackagesIns3:"+post.getSign ()+"/"+secondPackagesIns) ؛ // قبل الدفع ، إذا لم يكن الطلب مسجلاً لدى WeChat ، فيجب عليك أولاً الاتصال بـ iwxmsg.registerapp لتسجيل التطبيق على WeChat mapi.sendreq (REQ) ؛ log.d (tag ، "Run:" + AppId + "/" + prepayid + "/" + noncester + "/" + timestamp + "/" + secondPackagesIns) ؛ }}} catch (استثناء e) {} البايت الثابت العام [] httppost (url سلسلة ، كيان السلسلة) {if (url == null || url.length () == 0) {log.e (tag ، "httppost ، url is null") ؛ العودة لاغية. } httpclient httpclient = getNewhttpClient () ؛ httppost httppost = new httppost (url) ؛ جرب {httppost.setentity (striterity (الكيان الجديد)) ؛ httppost.setheader ("قبول" ، "تطبيق/json") ؛ httppost.setheader ("نوع المحتوى" ، "التطبيق/json") ؛ httpresponse resp = httpclient.execute (httppost) ؛ if (resp.getStatusLine (). getStatusCode ()! = httpstatus.sc_ok) {log.e (tag ، "httpget fail ، status code =" + resp.getStatusLine (). getStatusCode ()) ؛ العودة لاغية. } return entityUtils.tobytearray (resp.getentity ()) ؛ } catch (استثناء e) {log.e (tag ، "Httppost stisply ، e =" + e.getMessage ()) ؛ E.PrintStackTrace () ؛ العودة لاغية. }} // طريقة للحصول على سلسلة عشوائية String static static gennoncester () {Random Random = new Random () ؛ return md5.getMessagedIgest (string.valueof (random.nextint (10000)). getBytes ()) ؛ } سلسلة خاصة toxml (قائمة <MameValUepair> 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 () ؛ } الخريطة العامة <string ، string> decodexml (محتوى السلسلة) {try {map <string ، string> xml = new HashMap <> () ؛ xmlpullparser parser = xml.newpullparser () ؛ parser.setInput (New StringReader (content)) ؛ int event = parser.getEventType () ؛ بينما (الحدث! = xmlpullparser.end_document) {string nodeName = parser.getName () ؛ Switch (event) {case xmlpullparser.start_document: break ؛ case xmlpullparser.start_tag: if (! } استراحة؛ CASE XMLPullParser.end_tag: Break ؛ } event = parser.next () ؛ } إرجاع XML ؛ } catch (استثناء e) {} return null ؛ } @nonnull قائمة خاصة <MameValUepair> getFirstSignParams (wxprepost params) {list <MameValUepair> packageParams = new LinkedList <> () ؛ packparams.add (New BasicNameValuePair ("appid" ، "appid")) ؛ packparams.add (New BasicNameValuePair ("body" ، params.body)) ؛ packparams.add (New BasicNameValuePair ("التفاصيل" ، params.detail)) ؛ packparams.add (New BasicNameValuePair ("MCH_ID" ، "Merchant Number")) ؛ packparams.add (New BasicNameValuePair ("nonce_str" ، params.nonce_str)) ؛ packparams.add (New BasicNameValuePair ("notify_url" ، params.notify_url)) ؛ packparams.add (New BasicNameValuePair ("Out_trade_no" ، params.out_trade_no)) ؛ packparams.add (New BasicNameValuePair ("spbill_create_ip" ، params.spbill_create_ip)) ؛ packparams.add (New BasicNameValuePair ("Total_fee" ، params.total_fee + "")) ؛ packparams.add (New BasicNameValuePair ("Trade_type" ، params.trade_type)) ؛ packparams.add (New BasicNameValuePair ("sign" ، params.sign)) ؛ إرجاع PackageParams. } الفئة العامة wxprepost {// المعلمات التي يجب إحضارها مع سلسلة public appid ؛ // application appid معتمدة من قبل WeChat Open Platform String MCH_ID ؛ // رقم التاجر الذي تم تعيينه بواسطة WeChat Pay Public String nonce_str ؛ // سلسلة عشوائية ، لم يعد من 32 رقمًا. خوارزمية توليد الرقم العشوائي الموصى بها علامة السلسلة العامة ؛ // التوقيع ، انظر خوارزمية توقيع توقيع خوارزمية السلسلة العامة ؛ // الوصف المنتج تنسيق حقل المعاملة وفقًا للتنسيق التالي وفقًا لسيناريوهات التطبيق المختلفة: التطبيق - اسم التطبيق الذي يحتاج إلى تمريره إلى سوق التطبيقات - اسم المنتج الفعلي ، Tiantian Aiying Eliminate - Recharge. السلسلة العامة out_trade_no ؛ // رقم الطلب داخل نظام التاجر ، والذي يمكن أن يحتوي على أحرف ضمن 32 حرفًا. للحصول على تعليمات أخرى ، راجع رقم الطلب التاجر العام int total_fee ؛ // إجمالي مبلغ الطلب في المائة. للحصول على التفاصيل ، راجع مبلغ الدفع العام spbill_create_ip ؛ // سلسلة IP العامة الفعلية notify_url ؛ // عنوان رد الاتصال لاستلام WeChat الدفع الإخطارات غير المتزامنة ، يجب أن يكون عنوان URL للإخطار عنوان URL يمكن الوصول إليه مباشرة ولا يمكنه حمل المعلمات. (منصوص عليه في الخلفية) السلسلة العامة Trade_type ؛ // نوع الدفع // المعلمات غير المطلوبة ليتم تنفيذها للسلسلة العامة device_info ؛ // رقم الجهاز الطرفي (رقم المتجر أو معرف الجهاز أمين الصندوق) ، يرجى تمرير "الويب" افتراضيًا ؛ // تفاصيل اسم المنتج السلسلة العامة إرفاق ؛ // بيانات إضافية ، يتم إرجاعها كما في واجهة برمجة تطبيقات الاستعلام وإخطار الدفع. يستخدم هذا الحقل بشكل أساسي للبيانات المخصصة للتجار الذين يحملون الطلبات العامة FEE_TYPE ؛ // رمز الحروف المكون من ثلاثة أرقام يتوافق مع ISO 4217 القياسي ، الافتراضي RMB: CNY ، راجع نوع العملة للحصول على قوائم القيمة الأخرى للحصول على التفاصيل // السلسلة العامة time_start ؛ // وقت توليد الطلب هو YyyymmdDHHMMSS ، كما هو موضح في 20091225091010 ، كما هو موضح في 20091225091010. للحصول على تفاصيل أخرى ، راجع قواعد الوقت // السلسلة العامة time_expire ؛ // وقت انتهاء الصلاحية ، التنسيق هو YyyyMMDDHHMMSS ، كما هو موضح في 20091227091010 في 9:10 في 27 ديسمبر 2009. يرجى الرجوع إلى قواعد الوقت للحصول على تفاصيل أخرى. ملاحظة: يجب أن يكون الحد الأدنى لوقت انتهاء الصلاحية أكبر من 5 دقائق. سلسلة السلع العامة. // معلمات علامات المنتج أو القسائم أو خصومات الخصم. للحصول على التفاصيل ، يرجى الرجوع إلى القسائم أو خصومات الخصم. // public string limit_pay ؛ // no_credit-حدد لا يمكنك استخدام بطاقة ائتمان لدفع السلسلة العامة getAppId () {return appid ؛ } public void setAppId (string appid) {this.appid = appid ؛ } السلسلة العامة getMch_id () {return mch_id ؛ } public void setmch_id (String mch_id) {this.mch_id = mch_id ؛ } السلسلة العامة getNonce_str () {return nonce_str ؛ } public void setnonce_str (string nonce_str) {this.nonce_str = nonce_str ؛ } السلسلة العامة getSign () {return sign ؛ } public void setSign (scre string) {this.sign = sign ؛ } السلسلة العامة getBody () {return Body ؛ } public void setBody (سلسلة سلسلة) {this.body = body ؛ } السلسلة العامة 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 ؛ } السلسلة العامة getSpbill_create_ip () {return spbill_create_ip ؛ } public void setspbill_create_ip (string spbill_create_ip) {this.spbill_create_ip = spbill_create_ip ؛ } السلسلة العامة getNotify_url () {return notify_url ؛ } public void setNotify_url (سلسلة notify_url) {this.notify_url = notify_url ؛ } السلسلة العامة gettrade_type () {return trade_type ؛ } public void settrade_type (string trade_type) {this.trade_type = trade_type ؛ } السلسلة العامة getDevice_info () {return device_info ؛ } public void setDevice_info (String device_info) {this.device_info = device_info ؛ } السلسلة العامة getDetail () {إرجاع تفاصيل ؛ } public void setDetail (سلسلة تفاصيل) {this.detail = التفاصيل ؛ } السلسلة العامة getattach () {return taken ؛ } public void setattach (سلسلة إرفاق) {this.attach = attach ؛ } السلسلة العامة getfee_type () {return fee_type ؛ } public void setfee_type (String fee_type) {this.fee_type = fee_type ؛ } السلسلة العامة getTime_Start () {return time_start ؛ } public void setTime_Start (String Time_start) {this.time_start = time_start ؛ } السلسلة العامة getTime_expire () {return time_expire ؛ } public void settime_expire (string time_expire) {this.time_expire = time_expire ؛ } السلسلة العامة getGoods_tag () {return goods_tag ؛ } public void setgoods_tag (String Goods_tag) {this.goods_tag = goods_tag ؛ } السلسلة العامة getLimit_Pay () {return limit_pay ؛ } public void setlimit_pay (String limit_pay) {this.limit_pay = limit_pay ؛ }}يمكن الحصول على المعلمات الواردة هنا من قبل محطة الهاتف المحمول نفسها. بالطبع ، من الأفضل تزويدنا بالخلفية لأسباب أمنية.
بعد الانتهاء من الدفع ، سيقوم WeChat باستدعاء WXPayEntryActivity. لن أخوض في التفاصيل هنا. تنص وثيقة WeChat بوضوح على نتائج دفعة WeChat التي تم إرجاعها في OnResp () من WxPayentRyactivity (ملاحظة: لا يمكن أن تكون هذه النتيجة نتيجة لشراء المنتج بنجاح. يجب أن نستخدم رد اتصال WeChat إلى مضيق تايوان ثم العودة إلى مضيق تايوان لإخبارنا بنتيجة الدفع).
if (resp.getType () == ConstantApi.command_pay_by_wx) {int code = resp.errcode ؛ Switch (Code) {case 0: log.d (tag ، "onPayFinish ، errcode =" + "pay success") ؛ // بعد دفع WeChat ، انتقل إلى الخلفية ، ونتيجة الدفع التي يتم إرجاعها بواسطة الخلفية هي الأساس. // هذا هو رد الاتصال بعد اكتمال دفع WeChat. فيما يلي طلب للخلفية واطلب منه أن يخبرنا ما إذا كانت الدفع ناجحة. استراحة؛ الحالة -1: Toast.Maketext (هذا ، "Pay Fails 1" ، Toast.Length_Short) .Show () ؛ log.d (tag ، "onpayfinish ، errcode =" + "pay failed 1") ؛ ينهي()؛ استراحة؛ الحالة -2: toast.maketext (هذا ، "Pay Cancel" ، toast.length_short) .show () ؛ log.d (tag ، "onPayFinish ، errcode =" + "pay cancel") ؛ ينهي()؛ استراحة؛ الافتراضي: // toast.maketext (هذا ، "Pay FAIL 2" ، Toast.length_short) .show () ؛ log.d (tag ، "onPayfinish ، errcode =" + "pay failed 2") ؛ setResult (result_ok) ؛ ينهي()؛ استراحة؛ }}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.