في الآونة الأخيرة ، يتطلب المشروع دفع WeChat ، ثم نظرت إلى دفع حساب WeChat الرسمي. على الرغم من أنه ليس صعبًا ، إلا أن التفاصيل لا تزال بحاجة إلى الانتباه إليها. قضيت معظم اليوم في كتابة عرض تجريبي واختبرت عملية الدفع تمامًا. دعنا نشارك تجربة حساب الحساب الرسمي في WeChat أدناه.
1. تكوين حساب WeChat الرسمي
نحتاج إلى تكوين عنوان دفع الحساب الرسمي لـ WeChat واختبار القائمة البيضاء.
على سبيل المثال: عنوان صفحة الدفع JS هو http://www.xxx.com/shop/pay/
ثم هنا يتم تكوين www.xxx.com/shop/pay/
2. عملية التنمية
استعارة حساب WeChat الرسمي لدفع ثمن واجهة برمجة التطبيقات (العنوان http://pay.weixin.qq.com/wiki/doc/api/Index.php؟chapter=7_4) ، والتي نحتاج إلى تطويرها باللون الأحمر. على النحو التالي:
3. تقديم طلب مع خادم WeChat
اتصل بالواجهة الفردية الموحدة بحيث يمكنك الحصول على الدفع prepay_id من WeChat (http://pay.weixin.qq.com/wiki/doc/api/index.php؟chapter=9_1).
قبل استدعاء هذه الواجهة ، هناك العديد من الحقول المفتوحة التي يجب ملؤها لدفع H5.
3.1 الحصول على OpenID
يمكنك استخدام نموذج ترخيص الويب (http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html)
أرسل الرابط التالي في WeChat
https://open.weixin.qq.com/connect/oauth2/authorize؟appid=wx520c15f417810387&redirect_uri=url&response_type=code&scope=snsapi_base&state=123 3 proiChat_Reredirect
3.2 تقديم طلب للحصول على prepay_id
الكود كما يلي ، والذي يرسل بالفعل ملف XML من خلال POST للحصول على prepay_id المرسلة من خادم WeChat.
استيراد java.io.bytearrayinputstream ؛ استيراد JavaioException ؛ استيراد JavaioInputStream ؛ استيراد javaiounsupportedencodingexception ؛ استيراد javautildate. استيراد javautilhashmap ؛ استيراد javautiliterator. استيراد javautilmap ؛ استيراد javautilmapentry. استيراد javautilrandom. استيراد javaxservlethtttttpservletrequest ؛ استيراد javaxservlethtttttpservletresponse ؛ استيراد orgapacheCommonsconscodeCdigestDigestUtils ؛ استيراد orgspringframeworkstereotypeController ؛ استيراد orgspringframeworkworkwebindannotationRequestMapping ؛ استيراد orgxmlpullvxmlpullparser ؛ استيراد orgxmlpullvxmlpullparserexception ؛ استيراد orgxmlpullvxmlpullparserfactory ؛ استيراد comfasterxmljacksondatabindjsonnode ؛ استيراد comgsonoauthoauth ؛ استيراد comgsonoauthpay ؛ استيراد comgsonutilhttpkit ؛ استيراد comsyutildateTimeUtil. استيراد comsyutiljsonutil ؛ controller @requestmapping ("/pay") الفئة العامة wxpayController {REquestMapping (value = "wxprepaydo") public void jspay (httpservletrequest request ، httpservletresponse response ، string callback) يلقي استثناء {// get Open OpenId = request ، if (openId == null) {openId = getUserOpenId (request) ؛ } string appid = "WX16691FCB0523C1A4" ؛ String paternerkey = "iningfeng1234567FDFWFDFD1SS234567" ؛ String Out_trade_no = getTradeno () ؛ خريطة <string ، string> paramap = new hashmap <string ، string> () ؛ paramapput ("appid" ، appid) ؛ paramapput ("إرفاق" ، "اختبار") ؛ paramapput ("الجسم" ، "اختبار شراء الاختبار") ؛ paramapput ("mch_id" ، "10283271") ؛ paramapput ("nonce_str" ، create_nonce_str ()) ؛ paramapput ("OpenId" ، OpenId) ؛ paramapput ("Out_trade_no" ، Out_trade_no) ؛ paramapput ("spbill_create_ip" ، getaddrip (request)) ؛ paramapput ("Total_fee" ، "1") ؛ paramapput ("trade_type" ، "jsapi") ؛ paramapput ("notify_url" ، "http: // wwwxxxco/bank/page/wxnotify") ؛ علامة السلسلة = getSign (paramap ، paternerkey) ؛ paramapput ("علامة" ، علامة) ؛ // Order Order https: // apimchweixinqqcom/pay/unifyorder string url = "https: // apimchweixinqqcom/pay/unifyorder" ؛ String XML = ArrayToxMl (paramap) ؛ String xmlstr = httpkitpost (url ، xml) ؛ // سلسلة معرف المنتج المسبق prepay_id = "" ؛ if (xmlstrindexof ("success")! = -1) {map <string ، string> map = doxmlparse (xmlstr) ؛ prepay_id = (string) mapget ("prepay_id") ؛ } الخريطة <string ، string> paymap = new HashMap <string ، string> () ؛ paymapput ("appid" ، appid) ؛ paymapput ("timestamp" ، create_timestamp ()) ؛ paymapput ("noncester" ، create_nonce_str ()) ؛ PayMapput ("SignType" ، "MD5") ؛ paymapput ("package" ، "prepay_id =" + prepay_id) ؛ سلسلة paysign = getSign (paymap ، paternerkey) ؛ paymapput ("pg" ، prepared_id) ؛ PayMapput ("Paysign" ، Paysign) ؛ WebUtilResponse (Response ، WebUtilpackjsonp (Callback ، JsonutilwarpjsonnodeResponse (jsonutilobjecttojsonnode (paymap)) tostring ())) ؛ } / ** * خريطة إلى xml * * param arr * return * / string public arraytoxml (map <string ، string> arr) {string xml = "<xml>" ؛ iterator <intrad <string ، string >> iter = arrentrySet () iterator () ؛ بينما (iterhasnext ()) {entry <string ، string> entry = iternext () ؛ مفتاح السلسلة = EntplgetKey () ؛ String val = entergetValue () ؛ xml + = "<" + key + ">" + val + "</" + key + ">" ؛ } xml += "</xml>" ؛ إرجاع XML ؛ } // الحصول على سلسلة خاصة مفتوحة getUserOpenId (طلب httpservletrequest) رمي الاستثناء {string code = requestGetParameter ("code") ؛ if (code == null) {string openId = requestGetParameter ("OpenId") ؛ العودة openid. } oauth o = new oauth () ؛ الرمز المميز للسلسلة = ogettoken (رمز) ؛ jsonnode node = jsonutilStringToJsonnode (token) ؛ string openId = nodeget ("openId") astext () ؛ العودة openid. } سلسلة خاصة create_nonce_str () {string chars = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789" ؛ سلسلة الدقة = "" ؛ لـ (int i = 0 ؛ i <16 ؛ i ++) {random rd = new random () ؛ res += charscharat (rdnextint (charslength () - 1)) ؛ } return res ؛ } سلسلة خاصة getaddrip (طلب httpservletrequest) {return requestGetRemoteadDr () ؛ } سلسلة خاصة create_timestamp () {return longtoString (SystemCurrentTimeMillis () / 1000) ؛ } سلسلة خاصة getTradeno () {String timestamp = dateTimeUtilFormatDate (New Date () ، dateTimeUtildatEtime_pattern) ؛ إرجاع "hzno" + timestamp ؛ } سلسلة خاصة GetSign (Map <String ، String> params ، String paternerkey) ترمي UnsupportedEncodingException {String string1 = paycreatesign (params ، false) ؛ String STRINGSINGTEMP = string1 + "& key =" + paternerkey ؛ signvalue string = digestutilsmd5Hex (stringsigntemp) touppercase () ؛ عودة signvalue ؛ } خريطة خاصة <string ، string> doxmlparse (سلسلة xml) يلقي xmlpullparserexception ، ioException {inputStream inputStream = new BytearRayInputStream (xmlgetbytes ()) ؛ الخريطة <string ، string> map = null ؛ xmlpullparser pullparser = xmlpullparserfactorynewinstance () newPullParser () ؛ pullparsersetInput (inputStream ، "UTF-8") ؛ // قم بتعيين بيانات XML ليتم تحليلها لـ XML int eventType = pullparsergetEventType () ؛ بينما (eventType! = xmlpullparserend_document) {switch (eventType) {case xmlpullparserstart_document: map = new hashmap <string ، string> () ؛ استراحة؛ CASE XMLPullParserSTart_TAG: string key = pullparsergetName () ؛ إذا (keyequals ("xml")) استراحة ؛ قيمة السلسلة = pullParserNextText () ؛ MAPUT (مفتاح ، القيمة) ؛ استراحة؛ Case XmlPullParserend_tag: Break ؛ } eventType = pullparsernext () ؛ } خريطة الإرجاع ؛ }}4. دفع H5
H5 الدفع هو في الواقع بسيط للغاية. ما عليك سوى استدعاء طريقة JS لمتصفح WeChat المدمج (http://pay.weixin.qq.com/wiki/doc/api/index.php؟chapter=7_7)
<٪@ page language = "java" contentType = "text/html ؛ charset = utf-8" pageencoding = "utf-8" ٪> <٪@ taglib precix = "spring" uri = "http: // wwwspringframeworkorg/tags" ٪> <٪ requestgetpathpath () ؛ String BasePath = requestGetScheme () + ": //" + requestSetServerName () + ":" + requestGetServerPort () + path + "/" ؛ ٪> <! doctype html public "-// w3c // dtd html 01 transitional // en" "http: // wwworg/tr/html4/lOOStd"> <html> <Head> <head> <meta charset = "utf-8"/> الحد الأقصى scale = 0 ، قابلة للعلاج المستخدم = 0 " /> <meta name =" Apple-mobile-web-app-app-content = "yes" /> <meta name = "Apple-mobile-web-app-app-status-style" content = "meta deta =" black " /> <meta name = content = "telephone = no"/> <title> اختبار اختبار </title> <link href = "/css/csss؟ v = 0" rel = "tylesheet" type = "text/css"> </head> <body> <viv> wechat js test </div> <ul> <li> href = "javaScript: pay () ؛"> ادفع الآن </a> </p> </viv> </viv> <script type = "text/javaScript" src = "/js/zeptominJS urlparameter ("appid") ؛ var timestamp = urlparameter ("timestamp") ؛ var noncestr = urlparameter ("noncestr") ؛ var pg = urlparameter ("pg") ؛ var signtype = urlparameter ("signtype") ؛ var paysign = urlparameter ("paysign") ؛ وظيفة onbridgeready () {weixinjsbridgeinvoke ('getBrandwCpayRequest' ، {"appid": appid ، // اسم الحساب الرسمي ، تم تمريره في "timestamp": timestamp ، SignType ، // WeChat Signature Method: "Paysign": Paysign // WeChat Signature} ، الدالة (res) {if (reserr_msg == "get_brand_wcpay_request: OK") ناجح ، لكنه لا يضمن أنه موثوق به تمامًا. } pay pay () {if (typeof weixinjsbridge == "undefined") {if (documentAdDeventListener) {documentadDeventListener ('weixinjsbridgeready' ، onbridgeready ، false) ؛ } آخر إذا (documentattachevent) {documentattachevent ('weixinjsbridgeready' ، etbridgeready) ؛ documentattatachevent ('onweixinjsbridgeready' ، onbridgeready) ؛ }} else {onBridgerEady () ؛ }} </script> </body> </html> التأثير على النحو التالي
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.