亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
業(yè)務(wù)流程
建立訂單
調(diào)用統(tǒng)一下單
喚起支付
小結(jié)?
首頁 微信小程式 微信開發(fā) 公眾號支付介面的開發(fā)

公眾號支付介面的開發(fā)

Mar 16, 2018 pm 02:28 PM
開發(fā) 介面 支付

這次帶給大家公眾號支付介面的開發(fā),公眾號支付介面開發(fā)的注意事項有哪些,以下就是實戰(zhàn)案例,一起來看一下。

公眾號支付就是在微信裡面的H5頁喚起微信支付,不用掃碼即可付款的功能。做這個功能首先要明確的就是,只有和商戶號碼mch_id相符的appid才能成功付款。商戶號碼在註冊成功的時候就會將相關(guān)資訊傳送到郵箱裡面。而喚起支付的一個關(guān)鍵就是靠openid拿到統(tǒng)一下單。而openid是和appid一一對應(yīng)的。也就是說如果你登入使用的appid不是公眾號碼的appid,得到的openid就無法喚起公眾號內(nèi)的支付(會出現(xiàn)appid和商家號碼不符的錯誤)。曾經(jīng)就在這個地方繞了個彎,因為微信的開放平臺可以創(chuàng)建網(wǎng)站應(yīng)用,也有一個appid和appsecreat,也可以在微信裡面一鍵登入。

業(yè)務(wù)流程

下面是微信的官方流程,看似有點複雜,重點就是要拿到統(tǒng)一下單接口返回的json串,其他按照官方demo基本就能正確,下面說一下幾個細節(jié)。

建立訂單

在呼叫微信公眾號付款之前,首先我們自己要把訂單創(chuàng)建好。比如一個儲值的訂單。主要是先確定下金額再進行下一步。

??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});
        }

調(diào)用統(tǒng)一下單

訂單創(chuàng)建成功之後,頁面跳到支付頁面,這個時候就是按照官方的流程去拿prepay_id和paySign,微信的demo中提供了一個jsApiPay的對象。但這個物件需要一個page物件初始化。

       [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();
        }

在MVC中我們簡單改一下就好了。也就是把page物件換成httpContext即可。然後裡面的方法就可以直接用了。

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;
????????}
????}
}

View Code

#這個頁面可以在本地調(diào)試,可以比較方便的確認參數(shù)是否ok。

喚起支付

官方頁面的範(fàn)例如下:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6?但主要的參數(shù)(mark部分)是由背景產(chǎn)生的,也就是上一個步驟的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,但并不保證它絕對可靠。?
???????}
???);?
}

所以在MVC中要這樣寫:

@{
????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>

必須要用Html.Raw,不然json解析不對,無法付款。這時候點擊頁面,會出現(xiàn)微信的載入效果,但別高興的太早,還是會出錯,出現(xiàn)一個「3目前的URL未註冊」

原因就在於,需要在公眾號中設(shè)定支付目錄。而這個支付目錄是大小寫敏感的,所以你得多試幾次。直到彈出輸入密碼的視窗才是真的流程正確了。然後支付成功之後馬上就可以收到j(luò)s中的回調(diào),這個時候你可以去處理你的訂單和業(yè)務(wù)邏輯。

小結(jié)?

如果是生產(chǎn)環(huán)境,我們需要再多個地方調(diào)用,需要再封裝一下。

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);
????}
}

View 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));
????????????}
????????}

呼叫的時候這樣直接喚起支付了。 但如果傳入的json不是json對象,微信載入動畫會一直卡在哪裡。

?$.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)一下單失敗!");
????????????????????????????????}
????????????????????????????});

我相信看了本文案例你已經(jīng)掌握了方法,更多精彩請關(guān)注php中文網(wǎng)其它相關(guān)文章!

推薦閱讀:

webpack自動刷新與解析的使用

webpack的模組熱替換詳解

JS事件先發(fā)布後訂閱的方法

以上是公眾號支付介面的開發(fā)的詳細內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
四款值得推薦的AI輔助程式工具 四款值得推薦的AI輔助程式工具 Apr 22, 2024 pm 05:34 PM

這個AI輔助程式工具在這個AI快速發(fā)展的階段,挖掘出了一大批好用的AI輔助程式工具。 AI輔助程式設(shè)計工具能夠提升開發(fā)效率、提升程式碼品質(zhì)、降低bug率,是現(xiàn)代軟體開發(fā)過程中的重要助手。今天大姚給大家分享4款A(yù)I輔助程式工具(而且都支援C#語言),希望對大家有幫助。 https://github.com/YSGStudyHards/DotNetGuide1.GitHubCopilotGitHubCopilot是一款A(yù)I編碼助手,可幫助你更快、更省力地編寫程式碼,從而將更多精力集中在問題解決和協(xié)作上。 Git

AI程式設(shè)計師哪家強?探索Devin、通靈靈碼和SWE-agent的潛力 AI程式設(shè)計師哪家強?探索Devin、通靈靈碼和SWE-agent的潛力 Apr 07, 2024 am 09:10 AM

2022年3月3日,距離世界首個AI程式設(shè)計師Devin誕生不足一個月,普林斯頓大學(xué)的NLP團隊開發(fā)了一個開源AI程式設(shè)計師SWE-agent。它利用GPT-4模型在GitHub儲存庫中自動解決問題。 SWE-agent在SWE-bench測試集上的表現(xiàn)與Devin相似,平均耗時93秒,解決了12.29%的問題。 SWE-agent透過與專用終端交互,可以開啟、搜尋文件內(nèi)容,使用自動語法檢查、編輯特定行,以及編寫和執(zhí)行測試。 (註:以上內(nèi)容為原始內(nèi)容微調(diào),但保留了原文中的關(guān)鍵訊息,未超過指定字數(shù)限制。)SWE-A

學(xué)習(xí)如何利用Go語言開發(fā)行動應(yīng)用程式 學(xué)習(xí)如何利用Go語言開發(fā)行動應(yīng)用程式 Mar 28, 2024 pm 10:00 PM

Go語言開發(fā)行動應(yīng)用程式教學(xué)隨著行動應(yīng)用程式市場的不斷蓬勃發(fā)展,越來越多的開發(fā)者開始探索如何利用Go語言開發(fā)行動應(yīng)用程式。作為一種簡潔高效的程式語言,Go語言在行動應(yīng)用開發(fā)中也展現(xiàn)了強大的潛力。本文將詳細介紹如何利用Go語言開發(fā)行動應(yīng)用程序,並附上具體的程式碼範(fàn)例,幫助讀者快速入門並開始開發(fā)自己的行動應(yīng)用程式。一、準(zhǔn)備工作在開始之前,我們需要準(zhǔn)備好開發(fā)環(huán)境和工具。首

Go語言前端技術(shù)探秘:前端開發(fā)新視野 Go語言前端技術(shù)探秘:前端開發(fā)新視野 Mar 28, 2024 pm 01:06 PM

Go語言作為一種快速、高效的程式語言,在後端開發(fā)領(lǐng)域廣受歡迎。然而,很少有人將Go語言與前端開發(fā)聯(lián)繫起來。事實上,使用Go語言進行前端開發(fā)不僅可以提高效率,還能為開發(fā)者帶來全新的視野。本文將探討使用Go語言進行前端開發(fā)的可能性,並提供具體的程式碼範(fàn)例,幫助讀者更了解這一領(lǐng)域。在傳統(tǒng)的前端開發(fā)中,通常會使用JavaScript、HTML和CSS來建立使用者介面

Java 中介面與抽象類別在設(shè)計模式中的應(yīng)用 Java 中介面與抽象類別在設(shè)計模式中的應(yīng)用 May 01, 2024 pm 06:33 PM

介面和抽象類別在設(shè)計模式中用於解耦和可擴展性。介面定義方法簽名,抽象類別提供部分實現(xiàn),子類別必須實作未實現(xiàn)的方法。在策略模式中,介面用於定義演算法,抽象類別或具體類別提供實現(xiàn),允許動態(tài)切換演算法。在觀察者模式中,介面用於定義觀察者行為,抽象類別或具體類別用於訂閱和發(fā)布通知。在適配器模式中,介面用於適應(yīng)現(xiàn)有類,抽象類或具體類可實現(xiàn)相容接口,允許與原有程式碼互動。

VSCode最適合哪種框架開發(fā)? VSCode最適合哪種框架開發(fā)? Mar 25, 2024 pm 02:03 PM

VSCode是一款功能強大、靈活、易於擴充的開源程式碼編輯器,廣受開發(fā)者青睞。它支援眾多程式語言和框架,能夠滿足不同專案需求。但是,針對不同的框架,VSCode的優(yōu)勢可能有所不同。本文將討論VSCode在不同框架開發(fā)中的適用性,並提供具體的程式碼範(fàn)例。 1.ReactReact是一款流行的JavaScript庫,用於建立使用者介面。在使用React開發(fā)專案時,

PHP介面簡介及其定義方式 PHP介面簡介及其定義方式 Mar 23, 2024 am 09:00 AM

PHP介面簡介及其定義方式PHP是一種廣泛應(yīng)用於Web開發(fā)的開源腳本語言,具有靈活、簡單、強大等特性。在PHP中,介面(interface)是一種定義多個類別之間公共方法的工具,實現(xiàn)了多態(tài)性,讓程式碼更加靈活和可重複使用。本文將介紹PHP介面的概念及其定義方式,同時提供具體的程式碼範(fàn)例展示其用法。 1.PHP介面概念介面在物件導(dǎo)向程式設(shè)計中扮演著重要的角色,定義了類別應(yīng)

PHP中的介面和抽象類別有何不同? PHP中的介面和抽象類別有何不同? Jun 04, 2024 am 09:17 AM

介面和抽象類別用於建立可擴展的PHP程式碼,它們之間存在以下關(guān)鍵差異:介面透過實作強制執(zhí)行,而抽象類別透過繼承強制執(zhí)行。介面不能包含具體方法,而抽象類別可以。一個類別可以實作多個接口,但只能從一個抽象類別繼承。介面不能實例化,而抽象類別可以。

See all articles