Entwicklung einer offiziellen Schnittstelle zur Kontozahlung
Mar 16, 2018 pm 02:28 PMDieses Mal werde ich Ihnen die Entwicklung der offiziellen Kontozahlungsschnittstelle vorstellen. Was sind die Vorsichtsma?nahmen bei der Entwicklung der offiziellen Kontozahlungsschnittstelle?
Offizielle Kontozahlung ist die Funktion, die WeChat-Zahlung auf der H5-Seite in WeChat aufzurufen und die Zahlung durchzuführen, ohne den QR-Code zu scannen. Bei der Implementierung dieser Funktion muss zun?chst klargestellt werden, dass nur die Appid erfolgreich bezahlen kann, die mit der H?ndlernummer mch_id übereinstimmt. Wenn das H?ndlerkonto erfolgreich registriert ist, werden relevante Informationen an die Mailbox gesendet. Ein Schlüssel zur Zahlungsanreizung besteht darin, sich auf openid zu verlassen, um einheitliche Bestellungen zu erhalten. Die openid entspricht der appid eins zu eins. Das hei?t, wenn die App-ID, mit der Sie sich anmelden, nicht die App-ID des offiziellen Kontos ist, kann die von Ihnen erhaltene OpenID keine Zahlung auf dem offiziellen Konto ausl?sen (es wird ein Fehler angezeigt, dass die App-ID nicht mit der App-ID übereinstimmt). H?ndlerkonto). Ich habe einmal einen Umweg hierher gemacht, weil die offene Plattform von WeChat Website-Anwendungen erstellen kann. Sie verfügt auch über eine App-ID und ein App-Geheimnis und Sie k?nnen sich auch mit einem Klick bei WeChat anmelden.
Gesch?ftsprozess
Das Folgende ist der offizielle Prozess von WeChat. Der entscheidende Punkt besteht darin, die JSON-Zeichenfolge von der einheitlichen Bestellschnittstelle zurückzugeben korrekt gem?? der offiziellen Demo unten Lassen Sie mich Ihnen ein paar Details erz?hlen.
Bestellung erstellen
Bevor wir das offizielle WeChat-Konto zur Zahlung aufrufen, müssen wir die Bestellung zun?chst selbst erstellen. Zum Beispiel eine Aufladebestellung. Die Hauptsache ist, zuerst den Betrag zu bestimmen und dann mit dem n?chsten Schritt fortzufahren.
??public?JsonResult?CreateRecharegOrder(decimal?money) ????????{????????????if?(money?< (decimal)0.01) return Json(new PaymentResult("充值金額非法!")); var user = _workContext.CurrentUser; var order = _paymentService.CreateRechargeOrder(user.Id, money); return Json(new PaymentResult(true) {OrderId = order.OrderNumber}); }
Unified Order aufrufen
Nachdem die Bestellung erfolgreich erstellt wurde, springt die Seite zur Zahlungsseite. Befolgen Sie zu diesem Zeitpunkt den offiziellen Prozess, um prepay_id und paySign zu erhalten, die bereitgestellt werden in der WeChat-Demo Ein jsApiPay-Objekt. Für dieses Objekt muss jedoch ein Seitenobjekt initialisiert werden.
[LoginValid] public ActionResult H5Pay(string orderNumber) { var user = _workContext.CurrentUser; var order = _paymentService.GetOrderByOrderNumber(orderNumber); //判斷訂單是否存在 //訂單是否已經(jīng)支付了 var openid = user.OpenId; var jsApipay = new JsApiPayMvc(this.ControllerContext.HttpContext); jsApipay.openid = openid; jsApipay.total_fee = (int)order.Amount * 100; WxPayData unifiedOrderResult = jsApipay.GetUnifiedOrderResult(); ViewBag.wxJsApiParam = jsApipay.GetJsApiParameters();//獲取H5調(diào)起JS API參數(shù) ViewBag.unifiedOrder = unifiedOrderResult.ToPrintStr(); ViewBag.OrderNumber = order.OrderNumber; return View(); }
In MVC k?nnen wir es einfach ?ndern. Ersetzen Sie also das Seitenobjekt durch httpContext. Dann k?nnen die darin enthaltenen Methoden direkt verwendet werden.
JsApiPayMvc:
using System;using System.Collections.Generic;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.Runtime.Serialization;using System.IO;using System.Text;using System.Net;using System.Web.Security;using LitJson;namespace WxPayAPI { public class JsApiPayMvc { /// <summary> ????????///?保存頁面對(duì)象,因?yàn)橐陬惖姆椒ㄖ惺褂肞age的Request對(duì)象????????///?</summary> ????????public?HttpContextBase?context?{?get;?set;?}????????///?<summary> ????????///?openid用于調(diào)用統(tǒng)一下單接口????????///?</summary> ????????public?string?openid?{?get;?set;?}????????///?<summary> ????????///?access_token用于獲取收貨地址js函數(shù)入口參數(shù)????????///?</summary> ????????public?string?access_token?{?get;?set;?}????????///?<summary> ????????///?商品金額,用于統(tǒng)一下單????????///?</summary> ????????public?int?total_fee?{?get;?set;?}????????///?<summary> ????????///?統(tǒng)一下單接口返回結(jié)果????????///?</summary> ????????public?WxPayData?unifiedOrderResult?{?get;?set;?}????????public?JsApiPayMvc(HttpContextBase?_context) ????????{ ????????????context?=?_context; ????????}????????/** ????????*? ????????*?網(wǎng)頁授權(quán)獲取用戶基本信息的全部過程 ????????*?詳情請(qǐng)參看網(wǎng)頁授權(quán)獲取用戶基本信息:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html ????????*?第一步:利用url跳轉(zhuǎn)獲取code ????????*?第二步:利用code去獲取openid和access_token ????????*? ????????*/ ????????public?void?GetOpenidAndAccessToken(string?code) ????????{????????????if?(!string.IsNullOrEmpty(code)) ????????????{????????????????//獲取code碼,以獲取openid和access_token ????????????????Log.Debug(this.GetType().ToString(),?"Get?code?:?"?+?code); ????????????????GetOpenidAndAccessTokenFromCode(code); ????????????}????????????else ????????????{????????????????//構(gòu)造網(wǎng)頁授權(quán)獲取code的URL ????????????????string?host?=?context.Request.Url.Host;????????????????string?path?=?context.Request.Path;????????????????string?redirect_uri?=?HttpUtility.UrlEncode("http://"?+?host?+?path); ????????????????WxPayData?data?=?new?WxPayData(); ????????????????data.SetValue("appid",?WxPayConfig.APPID); ????????????????data.SetValue("redirect_uri",?redirect_uri); ????????????????data.SetValue("response_type",?"code"); ????????????????data.SetValue("scope",?"snsapi_base"); ????????????????data.SetValue("state",?"STATE"?+?"#wechat_redirect");????????????????string?url?=?"https://open.weixin.qq.com/connect/oauth2/authorize?"?+?data.ToUrl(); ????????????????Log.Debug(this.GetType().ToString(),?"Will?Redirect?to?URL?:?"?+?url);????????????????try ????????????????{????????????????????//觸發(fā)微信返回code碼????????? ????????????????????context.Response.Redirect(url);//Redirect函數(shù)會(huì)拋出ThreadAbortException異常,不用處理這個(gè)異常????????????????}????????????????catch(System.Threading.ThreadAbortException?ex) ????????????????{ ????????????????} ????????????} ????????}????????/** ????????*? ????????*?通過code換取網(wǎng)頁授權(quán)access_token和openid的返回?cái)?shù)據(jù),正確時(shí)返回的JSON數(shù)據(jù)包如下: ????????*?{ ????????*??"access_token":"ACCESS_TOKEN", ????????*??"expires_in":7200, ????????*??"refresh_token":"REFRESH_TOKEN", ????????*??"openid":"OPENID", ????????*??"scope":"SCOPE", ????????*??"unionid":?"o6_bmasdasdsad6_2sgVt7hMZOPfL" ????????*?} ????????*?其中access_token可用于獲取共享收貨地址 ????????*?openid是微信支付jsapi支付接口統(tǒng)一下單時(shí)必須的參數(shù) ????????*?更詳細(xì)的說明請(qǐng)參考網(wǎng)頁授權(quán)獲取用戶基本信息:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html ????????*?@失敗時(shí)拋異常WxPayException????????*/ ????????public?void?GetOpenidAndAccessTokenFromCode(string?code) ????????{????????????try ????????????{????????????????//構(gòu)造獲取openid及access_token的url ????????????????WxPayData?data?=?new?WxPayData(); ????????????????data.SetValue("appid",?WxPayConfig.APPID); ????????????????data.SetValue("secret",?WxPayConfig.APPSECRET); ????????????????data.SetValue("code",?code); ????????????????data.SetValue("grant_type",?"authorization_code");????????????????string?url?=?"https://api.weixin.qq.com/sns/oauth2/access_token?"?+?data.ToUrl();????????????????//請(qǐng)求url以獲取數(shù)據(jù) ????????????????string?result?=?HttpService.Get(url); ????????????????Log.Debug(this.GetType().ToString(),?"GetOpenidAndAccessTokenFromCode?response?:?"?+?result);????????????????//保存access_token,用于收貨地址獲取 ????????????????JsonData?jd?=?JsonMapper.ToObject(result); ????????????????access_token?=?(string)jd["access_token"];????????????????//獲取用戶openid ????????????????openid?=?(string)jd["openid"]; ????????????????Log.Debug(this.GetType().ToString(),?"Get?openid?:?"?+?openid); ????????????????Log.Debug(this.GetType().ToString(),?"Get?access_token?:?"?+?access_token); ????????????}????????????catch?(Exception?ex) ????????????{ ????????????????Log.Error(this.GetType().ToString(),?ex.ToString());????????????????throw?new?WxPayException(ex.ToString()); ????????????} ????????}????????/** ?????????*?調(diào)用統(tǒng)一下單,獲得下單結(jié)果 ?????????*?@return?統(tǒng)一下單結(jié)果 ?????????*?@失敗時(shí)拋異常WxPayException?????????*/ ????????public?WxPayData?GetUnifiedOrderResult() ????????{????????????//統(tǒng)一下單 ????????????WxPayData?data?=?new?WxPayData(); ????????????data.SetValue("body",?"test"); ????????????data.SetValue("attach",?"test"); ????????????data.SetValue("out_trade_no",?WxPayApi.GenerateOutTradeNo()); ????????????data.SetValue("total_fee",?total_fee); ????????????data.SetValue("time_start",?DateTime.Now.ToString("yyyyMMddHHmmss")); ????????????data.SetValue("time_expire",?DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss")); ????????????data.SetValue("goods_tag",?"test"); ????????????data.SetValue("trade_type",?"JSAPI"); ????????????data.SetValue("openid",?openid); ????????????WxPayData?result?=?WxPayApi.UnifiedOrder(data);????????????if?(!result.IsSet("appid")?||?!result.IsSet("prepay_id")?||?result.GetValue("prepay_id").ToString()?==?"") ????????????{ ????????????????Log.Error(this.GetType().ToString(),?"UnifiedOrder?response?error!");????????????????throw?new?WxPayException("UnifiedOrder?response?error!"); ????????????} ????????????unifiedOrderResult?=?result;????????????return?result; ????????}????????/** ????????*?? ????????*?從統(tǒng)一下單成功返回的數(shù)據(jù)中獲取微信瀏覽器調(diào)起jsapi支付所需的參數(shù), ????????*?微信瀏覽器調(diào)起JSAPI時(shí)的輸入?yún)?shù)格式如下: ????????*?{ ????????*???"appId"?:?"wx2421b1c4370ec43b",?????//公眾號(hào)名稱,由商戶傳入????? ????????*???"timeStamp":"?1395712654",?????????//時(shí)間戳,自1970年以來的秒數(shù)????? ????????*???"nonceStr"?:?"e61463f8efa94090b1f366cccfbbb444",?//隨機(jī)串????? ????????*???"package"?:?"prepay_id=u802345jgfjsdfgsdg888",????? ????????*???"signType"?:?"MD5",?????????//微信簽名方式:???? ????????*???"paySign"?:?"70EA570631E4BB79628FBCA90534C63FF7FADD89"?//微信簽名? ????????*?} ????????*?@return?string?微信瀏覽器調(diào)起JSAPI時(shí)的輸入?yún)?shù),json格式可以直接做參數(shù)用 ????????*?更詳細(xì)的說明請(qǐng)參考網(wǎng)頁端調(diào)起支付API:http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7 ????????*? ????????*/ ????????public?string?GetJsApiParameters() ????????{ ????????????Log.Debug(this.GetType().ToString(),?"JsApiPay::GetJsApiParam?is?processing..."); ????????????WxPayData?jsApiParam?=?new?WxPayData(); ????????????jsApiParam.SetValue("appId",?unifiedOrderResult.GetValue("appid")); ????????????jsApiParam.SetValue("timeStamp",?WxPayApi.GenerateTimeStamp()); ????????????jsApiParam.SetValue("nonceStr",?WxPayApi.GenerateNonceStr()); ????????????jsApiParam.SetValue("package",?"prepay_id="?+?unifiedOrderResult.GetValue("prepay_id")); ????????????jsApiParam.SetValue("signType",?"MD5"); ????????????jsApiParam.SetValue("paySign",?jsApiParam.MakeSign());????????????string?parameters?=?jsApiParam.ToJson(); ????????????Log.Debug(this.GetType().ToString(),?"Get?jsApiParam?:?"?+?parameters);????????????return?parameters; ????????}????????/** ????????*? ????????*?獲取收貨地址js函數(shù)入口參數(shù),詳情請(qǐng)參考收貨地址共享接口:http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_9 ????????*?@return?string?共享收貨地址js函數(shù)需要的參數(shù),json格式可以直接做參數(shù)使用????????*/ ????????public?string?GetEditAddressParameters() ????????{????????????string?parameter?=?"";????????????try ????????????{????????????????string?host?=?context.Request.Url.Host;????????????????string?path?=?context.Request.Path;????????????????string?queryString?=?context.Request.Url.Query;????????????????//這個(gè)地方要注意,參與簽名的是網(wǎng)頁授權(quán)獲取用戶信息時(shí)微信后臺(tái)回傳的完整url ????????????????string?url?=?"http://"?+?host?+?path?+?queryString;????????????????//構(gòu)造需要用SHA1算法加密的數(shù)據(jù) ????????????????WxPayData?signData?=?new?WxPayData(); ????????????????signData.SetValue("appid",WxPayConfig.APPID); ????????????????signData.SetValue("url",?url); ????????????????signData.SetValue("timestamp",WxPayApi.GenerateTimeStamp()); ????????????????signData.SetValue("noncestr",WxPayApi.GenerateNonceStr()); ????????????????signData.SetValue("accesstoken",access_token);????????????????string?param?=?signData.ToUrl(); ????????????????Log.Debug(this.GetType().ToString(),?"SHA1?encrypt?param?:?"?+?param);????????????????//SHA1加密 ????????????????string?addrSign?=?FormsAuthentication.HashPasswordForStoringInConfigFile(param,?"SHA1"); ????????????????Log.Debug(this.GetType().ToString(),?"SHA1?encrypt?result?:?"?+?addrSign);????????????????//獲取收貨地址js函數(shù)入口參數(shù) ????????????????WxPayData?afterData?=?new?WxPayData(); ????????????????afterData.SetValue("appId",WxPayConfig.APPID); ????????????????afterData.SetValue("scope","jsapi_address"); ????????????????afterData.SetValue("signType","sha1"); ????????????????afterData.SetValue("addrSign",addrSign); ????????????????afterData.SetValue("timeStamp",signData.GetValue("timestamp")); ????????????????afterData.SetValue("nonceStr",signData.GetValue("noncestr"));????????????????//轉(zhuǎn)為json格式 ????????????????parameter?=?afterData.ToJson(); ????????????????Log.Debug(this.GetType().ToString(),?"Get?EditAddressParam?:?"?+?parameter); ????????????}????????????catch?(Exception?ex) ????????????{ ????????????????Log.Error(this.GetType().ToString(),?ex.ToString());????????????????throw?new?WxPayException(ex.ToString()); ????????????}????????????return?parameter; ????????} ????} }
Code anzeigen
Diese Seite kann lokal debuggt werden, und es ist bequemer zu best?tigen, ob die Parameter in Ordnung sind.
Zahlung wecken
Ein Beispiel für die offizielle Seite ist wie folgt: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index= 6 Aber die Hauptsache ist, dass die Parameter (Markierungsteil) durch den Hintergrund generiert werden, n?mlich ViewBag.wxJsApiParam
function?onBridgeReady(){ ???WeixinJSBridge.invoke( ???????'getBrandWCPayRequest',?{???????????"appId"?:?"wx2421b1c4370ec43b",?????//公眾號(hào)名稱,由商戶傳入????? ???????????"timeStamp":"?1395712654",?????????//時(shí)間戳,自1970年以來的秒數(shù)????? ???????????"nonceStr"?:?"e61463f8efa94090b1f366cccfbbb444",?//隨機(jī)串????? ???????????"package"?:?"prepay_id=u802345jgfjsdfgsdg888",????? ???????????"signType"?:?"MD5",?????????//微信簽名方式:????? ???????????"paySign"?:?"70EA570631E4BB79628FBCA90534C63FF7FADD89"?//微信簽名? ???????}, ???????function(res){????? ???????????if(res.err_msg?==?"get_brand_wcpay_request:ok"?)?{}?????//?使用以上方式判斷前端返回,微信團(tuán)隊(duì)鄭重提示:res.err_msg將在用戶支付成功后返回????ok,但并不保證它絕對(duì)可靠。? ???????} ???);? }
im vorherigen Schritt, also sollte es in MVC so geschrieben werden:
@{ ????ViewBag.Title?=?"微信支付"; ????Layout?=?"~/Views/Shared/_Layout.cshtml"; }<p class="page" id="Wxpayment"> ????<p class="content"> ????????<p>訂單詳情:@Html.Raw(ViewBag.unifiedOrder)</p> ????????<button id="h5pay" onclick="callpay()">支付</button> ????</p> ????<input type="hidden" value="@ViewBag.OrderNumber" id="ordernum"/></p> ?<script type="text/javascript"> ????//調(diào)用微信JS?api?支付 ????function?jsApiCall()?{ ????????WeixinJSBridge.invoke(????????????'getBrandWCPayRequest',????????????@Html.Raw(ViewBag.wxJsApiParam),//josn串 ????????????function?(res) ????????????{ ????????????????WeixinJSBridge.log(res.err_msg);????????????????//alert(res.err_code?+?res.err_desc?+?res.err_msg); ????????????????if?(res.err_msg?==?"get_brand_wcpay_request:ok")?{???????????????????var?num?=?$("#ordernum").val(); ????????????????????$.post("/payment/WeiXinPaySuccess",?{?ordernumber:?num?},?function(data)?{????????????????????????if?(data.IsSuccess?===?true)?{ ????????????????????????????alert("支付成功"); ????????????????????????????location.href?=?document.referrer; ????????????????????????}?else?{ ???????????????????????????? ????????????????????????} ????????????????????}); ????????????????}? ????????????????if?(res.err_msg?==?'get_brand_wcpay_request:cancel')?{ ??????????????????????$('.button').removeAttr('submitting'); ??????????????????????alert('取消支付'); ????????????????}? ????????????} ????????); ????}????function?callpay() ????{????????if?(typeof?WeixinJSBridge?==?"undefined") ????????{ ????????????alert("WeixinJSBridge?=");????????????if?(document.addEventListener) ????????????{ ????????????????document.addEventListener('WeixinJSBridgeReady',?jsApiCall,?false); ????????????}????????????else?if?(document.attachEvent) ????????????{ ????????????????document.attachEvent('WeixinJSBridgeReady',?jsApiCall); ????????????????document.attachEvent('onWeixinJSBridgeReady',?jsApiCall); ????????????} ????????}????????else ????????{ ????????????jsApiCall(); ????????} ????}</script>
muss Html .Raw verwenden, sonst ist die JSON-Analyse falsch und die Zahlung ist nicht m?glich. Klicken Sie zu diesem Zeitpunkt auf die Seite und der WeChat-Ladeeffekt wird angezeigt, aber freuen Sie sich nicht zu früh. Es tritt immer noch ein Fehler auf und die Meldung ?3 Die aktuelle URL ist nicht registriert“ wird angezeigt
Der Grund ist: Ja, Sie müssen im offiziellen Konto ein Zahlungsverzeichnis einrichten. Bei diesem Zahlungsverzeichnis wird die Gro?-/Kleinschreibung beachtet, daher müssen Sie es mehrmals versuchen. Der Vorgang ist wirklich korrekt, bis das Fenster zur Eingabe des Passworts erscheint. Dann k?nnen Sie den Rückruf in js sofort nach erfolgreicher Zahlung erhalten. Zu diesem Zeitpunkt k?nnen Sie Ihre Bestellung und Gesch?ftslogik bearbeiten.
Zusammenfassung
Wenn es sich um eine Produktionsumgebung handelt, müssen wir sie an mehreren Stellen aufrufen und erneut kapseln.
function?jsApiCall(json,?success,?fail)?{ ????WeixinJSBridge.invoke(????????'getBrandWCPayRequest', ????????json,//josn串 ????????function?(res) ????????{ ????????????WeixinJSBridge.log(res.err_msg);????????????//alert(res.err_code?+?res.err_desc?+?res.err_msg); ????????????if?(res.err_msg?==?"get_brand_wcpay_request:ok")?{????????????????//充值進(jìn)去?要區(qū)分是出題充值?還是購買懸賞?前者沖到他的錢包 ????????????????//后者直接沖到系統(tǒng)賬戶 ????????????????if?(success)?success(); ????????????}? ????????????if?(res.err_msg?==?'get_brand_wcpay_request:cancel')?{????????????????//?alert('取消支付'); ????????????????if?(fail)fail(); ????????????}? ????????} ????); }function?callpay(json,success,fail) {????if?(typeof?WeixinJSBridge?==?"undefined") ????{ ????????alert("請(qǐng)?jiān)谖⑿胖写蜷_!");????????if?(document.addEventListener) ????????{ ????????????document.addEventListener('WeixinJSBridgeReady',?jsApiCall,?false); ????????}????????else?if?(document.attachEvent) ????????{ ????????????document.attachEvent('WeixinJSBridgeReady',?jsApiCall); ????????????document.attachEvent('onWeixinJSBridgeReady',?jsApiCall); ????????} ????}????else ????{ ????????jsApiCall(json,?success,?fail); ????} }
Code anzeigen
??[LoginValid]????????public?ActionResult?H5PayJson(string?orederId) ????????{????????????var?user?=?_workContext.CurrentUser;????????????var?order?=?_paymentService.GetOrderByOrderNumber(orederId);????????????//判斷訂單是否存在????????????//訂單是否已經(jīng)支付了 ????????????var?openid?=?user.OpenId;????????????var?jsApipay?=?new?JsApiPayMvc(ControllerContext.HttpContext) ????????????{ ????????????????openid?=?openid, ????????????????total_fee?=?(int)?order.Amount*100 ????????????};????????????try ????????????{ ????????????????jsApipay.GetUnifiedOrderResult();????????????????return?Json(jsApipay.GetJsApiParameters());//實(shí)際還是字符串 ????????????}????????????catch?(Exception?e) ????????????{????????????????//統(tǒng)一下單失敗 ????????????????return?Json(new?PortalResult(false,?e.Message)); ????????????} ????????}
Bei Aufruf l?st dies direkt die Zahlung aus. Wenn der eingehende JSON jedoch kein JSON-Objekt ist, bleibt die WeChat-Ladeanimation immer h?ngen.
?$.post("/Checkout/H5PayJson",?{?orederId:?orderId?},?function?(jsondata)?{????????????????????????????????var?jdata?=?JSON.parse(jsondata);????????????????????????????????if?(jdata.appId)?{ ????????????????????????????????????callpay(jdata,?function?()?{ ????????????????????????????????????????$.post("/payment/WeiXinPaySuccess",?{?ordernumber:?orderId?},?function?(paymentdata)?{????????????????????????????????????????????if?(paymentdata.IsSuccess?===?true)?{ ????????????????????????????????????????????????submitQuestion(); ????????????????????????????????????????????}?else?{ ????????????????????????????????????????????????$.alert(paymentdata.Message); ????????????????????????????????????????????} ????????????????????????????????????????}); ????????????????????????????????????},?function?()?{ ????????????????????????????????????????$.alert("你已取消支付!"); ????????????????????????????????????}); ????????????????????????????????}?else?{ ????????????????????????????????????alert("統(tǒng)一下單失敗!"); ????????????????????????????????} ????????????????????????????});
Ich glaube, dass Sie die Methode beherrschen, nachdem Sie den Fall in diesem Artikel gelesen haben. Weitere spannende Informationen finden Sie in anderen verwandten Artikeln auf der chinesischen PHP-Website.
Empfohlene Lektüre:
Die Verwendung der automatischen Aktualisierung und Analyse von Webpacks
Detaillierte Erl?uterung des Hot-Ersatzes des Webpack-Moduls
Die Methode, zuerst JS-Ereignisse zu ver?ffentlichen und dann zu abonnieren
Das obige ist der detaillierte Inhalt vonEntwicklung einer offiziellen Schnittstelle zur Kontozahlung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Dieses KI-gestützte Programmiertool hat in dieser Phase der schnellen KI-Entwicklung eine gro?e Anzahl nützlicher KI-gestützter Programmiertools zu Tage gef?rdert. KI-gestützte Programmiertools k?nnen die Entwicklungseffizienz verbessern, die Codequalit?t verbessern und Fehlerraten reduzieren. Sie sind wichtige Helfer im modernen Softwareentwicklungsprozess. Heute wird Dayao Ihnen 4 KI-gestützte Programmiertools vorstellen (und alle unterstützen die C#-Sprache). https://github.com/YSGStudyHards/DotNetGuide1.GitHubCopilotGitHubCopilot ist ein KI-Codierungsassistent, der Ihnen hilft, Code schneller und mit weniger Aufwand zu schreiben, sodass Sie sich mehr auf Probleml?sung und Zusammenarbeit konzentrieren k?nnen. Git

Am 3. M?rz 2022, weniger als einen Monat nach der Geburt von Devin, dem weltweit ersten KI-Programmierer, entwickelte das NLP-Team der Princeton University einen Open-Source-KI-Programmierer-SWE-Agenten. Es nutzt das GPT-4-Modell, um Probleme in GitHub-Repositorys automatisch zu l?sen. Die Leistung des SWE-Agenten auf dem SWE-Bench-Testsatz ist ?hnlich wie die von Devin, er ben?tigt durchschnittlich 93 Sekunden und l?st 12,29 % der Probleme. Durch die Interaktion mit einem dedizierten Terminal kann der SWE-Agent Dateiinhalte ?ffnen und durchsuchen, die automatische Syntaxprüfung verwenden, bestimmte Zeilen bearbeiten sowie Tests schreiben und ausführen. (Hinweis: Der obige Inhalt stellt eine geringfügige Anpassung des Originalinhalts dar, die Schlüsselinformationen im Originaltext bleiben jedoch erhalten und überschreiten nicht die angegebene Wortbeschr?nkung.) SWE-A

Tutorial zur Entwicklung mobiler Anwendungen in der Go-Sprache Da der Markt für mobile Anwendungen weiterhin boomt, beginnen immer mehr Entwickler damit, sich mit der Verwendung der Go-Sprache für die Entwicklung mobiler Anwendungen zu befassen. Als einfache und effiziente Programmiersprache hat die Go-Sprache auch gro?es Potenzial für die Entwicklung mobiler Anwendungen gezeigt. In diesem Artikel wird detailliert beschrieben, wie die Go-Sprache zum Entwickeln mobiler Anwendungen verwendet wird, und es werden spezifische Codebeispiele angeh?ngt, um den Lesern den schnellen Einstieg und die Entwicklung eigener mobiler Anwendungen zu erleichtern. 1. Vorbereitung Bevor wir beginnen, müssen wir die Entwicklungsumgebung und die Tools vorbereiten. Kopf

Als schnelle und effiziente Programmiersprache erfreut sich Go im Bereich der Backend-Entwicklung gro?er Beliebtheit. Allerdings assoziieren nur wenige Menschen die Go-Sprache mit der Front-End-Entwicklung. Tats?chlich kann die Verwendung der Go-Sprache für die Front-End-Entwicklung nicht nur die Effizienz verbessern, sondern Entwicklern auch neue Horizonte er?ffnen. In diesem Artikel wird die M?glichkeit der Verwendung der Go-Sprache für die Front-End-Entwicklung untersucht und spezifische Codebeispiele bereitgestellt, um den Lesern ein besseres Verst?ndnis dieses Bereichs zu erleichtern. In der traditionellen Frontend-Entwicklung werden h?ufig JavaScript, HTML und CSS zum Erstellen von Benutzeroberfl?chen verwendet

Schnittstellen und abstrakte Klassen werden in Entwurfsmustern zur Entkopplung und Erweiterbarkeit verwendet. Schnittstellen definieren Methodensignaturen, abstrakte Klassen stellen eine teilweise Implementierung bereit und Unterklassen müssen nicht implementierte Methoden implementieren. Im Strategiemuster wird die Schnittstelle zum Definieren des Algorithmus verwendet, und die abstrakte Klasse oder konkrete Klasse stellt die Implementierung bereit, wodurch ein dynamischer Wechsel von Algorithmen erm?glicht wird. Im Beobachtermuster werden Schnittstellen zum Definieren des Beobachterverhaltens verwendet, und abstrakte oder konkrete Klassen werden zum Abonnieren und Ver?ffentlichen von Benachrichtigungen verwendet. Im Adaptermuster werden Schnittstellen verwendet, um vorhandene Klassen anzupassen, oder konkrete Klassen k?nnen kompatible Schnittstellen implementieren und so eine Interaktion mit Originalcode erm?glichen.

VSCode ist ein leistungsstarker, flexibler und einfach erweiterbarer Open-Source-Code-Editor, der bei Entwicklern weithin beliebt ist. Es unterstützt viele Programmiersprachen und Frameworks, um unterschiedliche Projektanforderungen zu erfüllen. Allerdings k?nnen die Vorteile von VSCode je nach Framework unterschiedlich sein. In diesem Artikel wird die Anwendbarkeit von VSCode bei der Entwicklung verschiedener Frameworks erl?utert und spezifische Codebeispiele bereitgestellt. 1.ReactReact ist eine beliebte JavaScript-Bibliothek, die zum Erstellen von Benutzeroberfl?chen verwendet wird. Bei der Entwicklung von Projekten mit React,

Einführung in die PHP-Schnittstelle und wie sie definiert ist. PHP ist eine in der Webentwicklung weit verbreitete Open-Source-Skriptsprache. Sie ist flexibel, einfach und leistungsstark. In PHP ist eine Schnittstelle ein Werkzeug, das gemeinsame Methoden zwischen mehreren Klassen definiert, um Polymorphismus zu erreichen und Code flexibler und wiederverwendbar zu machen. In diesem Artikel werden das Konzept von PHP-Schnittstellen und deren Definition vorgestellt und spezifische Codebeispiele zur Veranschaulichung ihrer Verwendung bereitgestellt. 1. PHP-Schnittstellenkonzept Die Schnittstelle spielt eine wichtige Rolle in der objektorientierten Programmierung und definiert die Klassenanwendung

Schnittstellen und abstrakte Klassen werden verwendet, um erweiterbaren PHP-Code zu erstellen, und es gibt den folgenden Hauptunterschied zwischen ihnen: Schnittstellen erzwingen durch Implementierung, w?hrend abstrakte Klassen durch Vererbung erzwungen werden. Schnittstellen k?nnen keine konkreten Methoden enthalten, abstrakte Klassen hingegen schon. Eine Klasse kann mehrere Schnittstellen implementieren, aber nur von einer abstrakten Klasse erben. Schnittstellen k?nnen nicht instanziiert werden, abstrakte Klassen jedoch schon.
