


Développement d'une interface de paiement de compte officiel
Mar 16, 2018 pm 02:28 PMCette fois, je vais vous présenter le développement de l'interface de paiement du compte officiel. Quelles sont les précautions pour le développement de l'interface de paiement du compte officiel. Ce qui suit est un cas pratique, jetons un coup d'oeil.
Le paiement sur compte officiel consiste à appeler le paiement WeChat sur la page H5 de WeChat et à effectuer le paiement sans scanner le code QR. La première chose à préciser lors de la mise en ?uvre de cette fonction est que seul l'appid correspondant au numéro de commer?ant mch_id peut payer avec succès. Une fois le compte marchand enregistré avec succès, les informations pertinentes seront envoyées à la bo?te aux lettres. La clé pour susciter le paiement est de s’appuyer sur openid pour obtenir des commandes unifiées. L'openid correspond à l'appid un-à-un. C'est-à-dire que si l'appid que vous utilisez pour vous connecter n'est pas l'appid du compte officiel, l'openid que vous obtiendrez ne pourra pas déclencher le paiement sur le compte officiel (il y aura une erreur indiquant que l'appid ne correspond pas à celui du compte officiel). compte marchand). Une fois, j'ai fait un détour ici car la plate-forme ouverte de WeChat peut créer des applications de site Web. Elle dispose également d'un appid et d'un appsecret, et vous pouvez également vous connecter en un seul clic dans WeChat.
Processus commercial
Ce qui suit est le processus officiel de WeChat. Cela semble un peu compliqué. Le point clé est d'obtenir la cha?ne json renvoyée par l'interface de commande unifiée. correct selon la démo officielle. Ci-dessous, laissez-moi vous donner quelques détails.
Créer une commande
Avant d'appeler le compte officiel WeChat pour le paiement, nous devons d'abord créer la commande nous-mêmes. Par exemple, une commande de recharge. L’essentiel est de déterminer d’abord le montant, puis de passer à l’étape suivante.
??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}); }
Appeler la commande unifiée
Une fois la commande créée avec succès, la page passe à la page de paiement. à ce stade, suivez le processus officiel pour obtenir prepay_id et paySign, qui sont fournis. dans la démo WeChat Un objet jsApiPay. Mais cet objet nécessite qu'un objet page soit initialisé.
[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(); }
Dans MVC, nous pouvons simplement le changer. Autrement dit, remplacez l'objet page par httpContext. Ensuite, les méthodes à l’intérieur peuvent être utilisées directement.
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> ????????///?保存頁面對象,因為要在類的方法中使用Page的Request對象????????///?</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)獲取用戶基本信息的全部過程 ????????*?詳情請參看網(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ù)會拋出ThreadAbortException異常,不用處理這個異常????????????????}????????????????catch(System.Threading.ThreadAbortException?ex) ????????????????{ ????????????????} ????????????} ????????}????????/** ????????*? ????????*?通過code換取網(wǎng)頁授權(quán)access_token和openid的返回數(shù)據(jù),正確時返回的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ù) ????????*?更詳細的說明請參考網(wǎng)頁授權(quán)獲取用戶基本信息:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html ????????*?@失敗時拋異常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();????????????????//請求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é)果 ?????????*?@失敗時拋異常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時的輸入?yún)?shù)格式如下: ????????*?{ ????????*???"appId"?:?"wx2421b1c4370ec43b",?????//公眾號名稱,由商戶傳入????? ????????*???"timeStamp":"?1395712654",?????????//時間戳,自1970年以來的秒數(shù)????? ????????*???"nonceStr"?:?"e61463f8efa94090b1f366cccfbbb444",?//隨機串????? ????????*???"package"?:?"prepay_id=u802345jgfjsdfgsdg888",????? ????????*???"signType"?:?"MD5",?????????//微信簽名方式:???? ????????*???"paySign"?:?"70EA570631E4BB79628FBCA90534C63FF7FADD89"?//微信簽名? ????????*?} ????????*?@return?string?微信瀏覽器調(diào)起JSAPI時的輸入?yún)?shù),json格式可以直接做參數(shù)用 ????????*?更詳細的說明請參考網(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ù),詳情請參考收貨地址共享接口: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;????????????????//這個地方要注意,參與簽名的是網(wǎng)頁授權(quán)獲取用戶信息時微信后臺回傳的完整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; ????????} ????} }
Afficher le code
Cette page peut être déboguée localement, et il est plus pratique de confirmer si les paramètres sont corrects.
Provoquer le paiement
Un exemple de page officielle est le suivant?: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index= 6 Mais l'essentiel Les paramètres (partie marque) sont générés par l'arrière-plan, qui est le ViewBag.wxJsApiParam
function?onBridgeReady(){ ???WeixinJSBridge.invoke( ???????'getBrandWCPayRequest',?{???????????"appId"?:?"wx2421b1c4370ec43b",?????//公眾號名稱,由商戶傳入????? ???????????"timeStamp":"?1395712654",?????????//時間戳,自1970年以來的秒數(shù)????? ???????????"nonceStr"?:?"e61463f8efa94090b1f366cccfbbb444",?//隨機串????? ???????????"package"?:?"prepay_id=u802345jgfjsdfgsdg888",????? ???????????"signType"?:?"MD5",?????????//微信簽名方式:????? ???????????"paySign"?:?"70EA570631E4BB79628FBCA90534C63FF7FADD89"?//微信簽名? ???????}, ???????function(res){????? ???????????if(res.err_msg?==?"get_brand_wcpay_request:ok"?)?{}?????//?使用以上方式判斷前端返回,微信團隊鄭重提示:res.err_msg將在用戶支付成功后返回????ok,但并不保證它絕對可靠。? ???????} ???);? }
à l'étape précédente, donc dans MVC, il devrait être écrit comme ceci?:
@{ ????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>
doit utiliser Html .Raw, sinon l'analyse json sera incorrecte et le paiement ne sera pas possible. à ce moment-là, cliquez sur la page et l'effet de chargement de WeChat appara?tra, mais ne vous réjouissez pas trop t?t. Une erreur se produira toujours et un ??3?URL actuelle n'est pas enregistrée?? appara?tra
.
La raison est Oui, vous devez créer un répertoire de paiement dans le compte officiel. Ce répertoire de paiement est sensible à la casse, vous devez donc essayer plusieurs fois. Le processus est vraiment correct jusqu'à ce que la fenêtre de saisie du mot de passe apparaisse. Ensuite, vous pouvez recevoir le rappel en js immédiatement après la réussite du paiement. à ce moment, vous pouvez traiter votre commande et votre logique métier.
Résumé
S'il s'agit d'un environnement de production, nous devons l'appeler à plusieurs endroits et l'encapsuler à nouveau.
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")?{????????????????//充值進去?要區(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("請在微信中打開!");????????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); ????} }
Voir le code
??[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());//實際還是字符串 ????????????}????????????catch?(Exception?e) ????????????{????????????????//統(tǒng)一下單失敗 ????????????????return?Json(new?PortalResult(false,?e.Message)); ????????????} ????????}
Lors de l'appel, le paiement est directement évoqué. Mais si le json entrant n'est pas un objet json, l'animation de chargement de WeChat sera toujours bloquée.
?$.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)一下單失敗!"); ????????????????????????????????} ????????????????????????????});
Je pense que vous ma?trisez la méthode après avoir lu le cas dans cet article. Pour des informations plus intéressantes, veuillez prêter attention aux autres articles connexes sur le site Web chinois de php?!
Lecture recommandée?:
L'utilisation de l'actualisation et de l'analyse automatiques du webpack
Explication détaillée du remplacement à chaud du module du webpack
La méthode de publication des événements JS d'abord puis de s'abonner
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Cet outil de programmation assistée par l'IA a mis au jour un grand nombre d'outils de programmation assistée par l'IA utiles à cette étape de développement rapide de l'IA. Les outils de programmation assistés par l'IA peuvent améliorer l'efficacité du développement, améliorer la qualité du code et réduire les taux de bogues. Ils constituent des assistants importants dans le processus de développement logiciel moderne. Aujourd'hui, Dayao partagera avec vous 4 outils de programmation assistés par l'IA (et tous prennent en charge le langage C#). J'espère que cela sera utile à tout le monde. https://github.com/YSGStudyHards/DotNetGuide1.GitHubCopilotGitHubCopilot est un assistant de codage IA qui vous aide à écrire du code plus rapidement et avec moins d'effort, afin que vous puissiez vous concentrer davantage sur la résolution de problèmes et la collaboration. Git

Le 3 mars 2022, moins d'un mois après la naissance de Devin, le premier programmeur d'IA au monde, l'équipe NLP de l'Université de Princeton a développé un agent SWE pour programmeur d'IA open source. Il exploite le modèle GPT-4 pour résoudre automatiquement les problèmes dans les référentiels GitHub. Les performances de l'agent SWE sur l'ensemble de tests du banc SWE sont similaires à celles de Devin, prenant en moyenne 93 secondes et résolvant 12,29 % des problèmes. En interagissant avec un terminal dédié, SWE-agent peut ouvrir et rechercher le contenu des fichiers, utiliser la vérification automatique de la syntaxe, modifier des lignes spécifiques et écrire et exécuter des tests. (Remarque?: le contenu ci-dessus est un léger ajustement du contenu original, mais les informations clés du texte original sont conservées et ne dépassent pas la limite de mots spécifiée.) SWE-A

Didacticiel d'application mobile de développement du langage Go Alors que le marché des applications mobiles continue de cro?tre, de plus en plus de développeurs commencent à explorer comment utiliser le langage Go pour développer des applications mobiles. En tant que langage de programmation simple et efficace, le langage Go a également montré un fort potentiel dans le développement d'applications mobiles. Cet article présentera en détail comment utiliser le langage Go pour développer des applications mobiles et joindra des exemples de code spécifiques pour aider les lecteurs à démarrer rapidement et à commencer à développer leurs propres applications mobiles. 1. Préparation Avant de commencer, nous devons préparer l'environnement et les outils de développement. tête

En tant que langage de programmation rapide et efficace, le langage Go est très populaire dans le domaine du développement back-end. Cependant, peu de gens associent le langage Go au développement front-end. En fait, l’utilisation du langage Go pour le développement front-end peut non seulement améliorer l’efficacité, mais également ouvrir de nouveaux horizons aux développeurs. Cet article explorera la possibilité d'utiliser le langage Go pour le développement front-end et fournira des exemples de code spécifiques pour aider les lecteurs à mieux comprendre ce domaine. Dans le développement front-end traditionnel, JavaScript, HTML et CSS sont souvent utilisés pour créer des interfaces utilisateur.

Les interfaces et les classes abstraites sont utilisées dans les modèles de conception pour le découplage et l'extensibilité. Les interfaces définissent les signatures des méthodes, les classes abstraites fournissent une implémentation partielle et les sous-classes doivent implémenter des méthodes non implémentées. Dans le modèle de stratégie, l'interface est utilisée pour définir l'algorithme, et la classe abstraite ou la classe concrète assure l'implémentation, permettant une commutation dynamique des algorithmes. Dans le modèle d'observateur, les interfaces sont utilisées pour définir le comportement de l'observateur, et les classes abstraites ou concrètes sont utilisées pour s'abonner et publier des notifications. Dans le modèle d'adaptateur, les interfaces sont utilisées pour adapter les classes existantes ou les classes concrètes peuvent implémenter des interfaces compatibles, permettant une interaction avec le code d'origine.

VSCode est un éditeur de code open source puissant, flexible et facile à étendre, largement apprécié par les développeurs. Il prend en charge de nombreux langages et frameworks de programmation pour répondre aux différents besoins du projet. Cependant, les avantages de VSCode peuvent varier selon les frameworks. Cet article discutera de l'applicabilité de VSCode dans le développement de différents frameworks et fournira des exemples de code spécifiques. 1.ReactReact est une bibliothèque JavaScript populaire utilisée pour créer des interfaces utilisateur. Lors du développement de projets avec React,

Introduction à l'interface PHP et à sa définition. PHP est un langage de script open source largement utilisé dans le développement Web. Il est flexible, simple et puissant. En PHP, une interface est un outil qui définit des méthodes communes entre plusieurs classes, réalisant le polymorphisme et rendant le code plus flexible et réutilisable. Cet article présentera le concept des interfaces PHP et comment les définir, et fournira des exemples de code spécifiques pour démontrer leur utilisation. 1. Concept d'interface PHP L'interface joue un r?le important dans la programmation orientée objet, définissant l'application de classe

Les interfaces et les classes abstraites sont utilisées pour créer du code PHP extensible, et il existe la différence clé suivante entre elles?: les interfaces s'appliquent via l'implémentation, tandis que les classes abstraites s'appliquent via l'héritage. Les interfaces ne peuvent pas contenir de méthodes concrètes, contrairement aux classes abstraites. Une classe peut implémenter plusieurs interfaces, mais ne peut hériter que d'une seule classe abstraite. Les interfaces ne peuvent pas être instanciées, mais les classes abstraites le peuvent.
