1.)微信开发一般就是看文档,按部就班调用API就行,推荐一些SDK
.NET
https://github.com/JeffreySu/WeiXinMPSDK
JAVA
http://git.oschina.net/pyinjava/fastweixin
NodeJS
https://github.com/node-weixin/node-weixin-api
Python
http://git.oschina.net/jeffkit/wechat

2.)在之前的文章微信支付[v3]中,说过V2升V3的一些记录,签名的方式JSSDK方式,现新的微信支付已经不需要依赖于JSSDK

微信消息配置

已.NET 为例子,WeiXinMPSDK支持公众号与企业号,实现起来也比较简单

    /// <summary>/// 微信控制器/// </summary>public class WeixinController : Controller{private static readonly Logger logger = LogManager.GetCurrentClassLogger();public readonly string token = DbSetting.getAppText("Token");public readonly string appId = DbSetting.getAppText("AppID");public readonly string encodingAESKey = DbSetting.getAppText("EncodingAESKey");/// <summary>/// 微信验签/// </summary>/// <param name="signature"></param>/// <param name="timestamp"></param>/// <param name="nonce"></param>/// <param name="echostr"></param>/// <returns></returns>
        [HttpGet]public async Task<ActionResult> Index(string signature, string timestamp, string nonce, string echostr){return await Task.Run(() =>{if (!CheckSignature.Check(signature, timestamp, nonce, token)){return "failed:" + signature + "," + CheckSignature.GetSignature(timestamp, nonce, token) + "。如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。";}return echostr;}).ContinueWith(task => Content(task.Result));}/// <summary>/// 处理微信消息/// </summary>/// <param name="postModel">参数</param>/// <returns></returns>
        [HttpPost]public async Task<ActionResult> Index(PostModel postModel){return await Task.Run<ActionResult>(() =>
            {if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, token)){return new WeixinResult("参数错误!");}postModel.Token = token;postModel.EncodingAESKey = encodingAESKey;postModel.AppId = appId;var messageHandler = new MpWeixinMessageHandler(Request.InputStream, postModel);messageHandler.Execute();return new FixWeixinBugWeixinResult(messageHandler);}).ContinueWith(task => task.Result);}}

消息重载

    /// <summary>/// 处理微信消息 /// </summary>public class MpWeixinMessageHandler : MessageHandler<MessageContext<IRequestMessageBase, IResponseMessageBase>>{private static readonly Logger logger = LogManager.GetCurrentClassLogger();public readonly string appId = DbSetting.getAppText("AppID");public readonly string appSecret = DbSetting.getAppText("AppSecret");/// <summary>/// 构造函数/// </summary>/// <param name="inputStream"></param>/// <param name="postModel"></param>public MpWeixinMessageHandler(Stream inputStream, PostModel postModel): base(inputStream, postModel){WeixinContext.ExpireMinutes = 5;}/// <summary>/// 默认消息 [没有重写的OnXX方法,将默认返回DefaultResponseMessage中的结果]/// </summary>/// <param name="requestMessage"></param>/// <returns></returns>public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage){//ResponseMessageText也可以是News等其他类型var responseMessage = this.CreateResponseMessage<ResponseMessageText>();responseMessage.Content = "这条消息来自DefaultResponseMessage。";return responseMessage;}/// <summary>/// 关注微信公众号/// </summary>/// <param name="requestMessage"></param>/// <returns></returns>public override IResponseMessageBase OnEvent_SubscribeRequest(RequestMessageEvent_Subscribe requestMessage){var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(requestMessage);var token = CommonApi.GetToken(appId, appSecret).access_token;var user = CommonApi.GetUserInfo(token, requestMessage.FromUserName);responseMessage.Content = "Hi " + user.nickname + " ,感谢您关注XXX!!!";return responseMessage;}/// <summary>/// 取消关注公众号/// </summary>/// <param name="requestMessage"></param>/// <returns></returns>public override IResponseMessageBase OnEvent_UnsubscribeRequest(RequestMessageEvent_Unsubscribe requestMessage){return base.OnEvent_UnsubscribeRequest(requestMessage);}/// <summary>/// 发送文本消息/// </summary>/// <param name="requestMessage"></param>/// <returns></returns>public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage){var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(requestMessage);responseMessage.Content = "感谢您关注XXX!!! ";return responseMessage;}}

微信支付签名

#region 创建订单与生成微信支付 JSAPPI 签名/// <summary>/// 创建订单与生成微信支付 JSAPPI 签名/// </summary>/// <param name="create">订餐参数</param>/// <returns></returns>
        [HttpPost]public async Task<ActionResult> Create(Create create){try{logger.Info("orders create xml: " + create.ToXml());if (!ModelState.IsValid)return Json(new { IsError = true, ErrorMsg = "创建订单参数异常!!!", Data = string.Empty }, JsonRequestBehavior.AllowGet);//取购物车缓存var cart = CacheManger.Cache.Get<CartInfoModel>(create.OpenId);if (cart.IsNull() || cart.ShopId.IsNullOrEmpty() || cart.OpenID.IsNullOrEmpty() || cart.OpenID != create.OpenId || cart.CartItemList.IsNull() || cart.CartItemList.Count == 0)return Json(new { IsError = true, ErrorMsg = "创建订单参数异常!!!", Data = string.Empty }, JsonRequestBehavior.AllowGet);//控制库存与订单事物using (var conn = new SqlConnection(DbSetting.App)){await conn.OpenAsync();var trans = conn.BeginTransaction();//验证价格及库存[重要]//创建订单string subject = @"xxx支付";string orderNo = WxPayConfig.OutTradeNo;//!!! 1分钱测试 !!!decimal total_fee = 0.01m;var executeNum = await conn.ExecuteAsync(@"INSERT INTO Orders(Origin,ShopId,OpenId,Name,PhoneNo,[Subject],OrderNo,[Status],TotalFee,Coupon,Memo,CreateTime)VALUES(@Origin,@ShopId,@OpenId,@Name,@PhoneNo,@Subject,@OrderNo,@Status,@TotalFee,@Coupon,@Memo,@CreateTime)", new{Origin = AbpConstants.WEIXIN_ORIGIN,OpenId = create.OpenId,ShopId = Guid.Parse(cart.ShopId),Name = create.UserName,PhoneNo = create.Phone,Subject = subject,OrderNo = orderNo,Status = "R",TotalFee = cart.TotalPrice,Coupon = "0",Memo = string.Empty,CreateTime = DateTime.Now}, trans);if (executeNum <= 0){trans.Rollback();return Json(new { IsError = true, ErrorMsg = "创建订单异常!!!", Data = string.Empty }, JsonRequestBehavior.AllowGet);}foreach (var item in cart.CartItemList.Where(t => t.CartNum != 0)){executeNum = conn.Execute(@"INSERT INTO OrderDetail(OrderId,ItemId,ItemName,Num,UnitPrice,TotalFee)VALUES(@OrderId,@ItemId,@ItemName,@Num,@UnitPrice,@TotalFee)", new{OrderId = orderNo,ItemId = item.ItemId,ItemName = item.ItemName,Num = item.CartNum,UnitPrice = item.Price,TotalFee = item.Price * item.CartNum}, trans);if (executeNum <= 0){trans.Rollback();return Json(new { IsError = true, ErrorMsg = "创建订单明细异常!!!", Data = string.Empty }, JsonRequestBehavior.AllowGet);}}//提交事物
                      trans.Commit();var wxpay = await Order(WxPayConfig.APPID, create.OpenId, WxPayConfig.MCHID, orderNo, total_fee, WxPayConfig.NonceStr, subject, "没有优惠券", "XXX");if (wxpay.IsError){return Redirect(DbSetting.getAppText("Domain") + @"/oauth/1");}var jsApiDict = new SortedDictionary<string, string>();jsApiDict.Add("appId", appId);jsApiDict.Add("timeStamp", WxPayConfig.TimeStamp);jsApiDict.Add("nonceStr", WxPayConfig.NonceStr);jsApiDict.Add("package", "prepay_id=" + (wxpay.Data as SortedDictionary<string, string>)["prepay_id"]);jsApiDict.Add("signType", "MD5");jsApiDict.Add("paySign", WxPayConfig.GenerateSign(jsApiDict));return Json(new { IsError = false, ErrorMsg = string.Empty, Data = jsApiDict.ConvertDictionaryToJson() }, JsonRequestBehavior.AllowGet);}}catch (Exception ex){logger.Info("orders create  xml: " + create.ToXml() + " exception message: " + ex.Message);return Json(new{IsError = true,ErrorMsg = "创建订单异常!!!",Data = string.Empty}, JsonRequestBehavior.AllowGet);}}#endregion#region 微信支付签名/// <summary>/// 微信支付签名/// </summary>/// <param name="appid">公众账号ID</param>/// <param name="openid">微信唯一标识</param>/// <param name="mch_id">商户号</param>/// <param name="out_trade_no">商户订单号</param>/// <param name="total_fee">订单总金额,单位为分</param>/// <param name="nonce_str">随机字符串</param>/// <param name="body"></param>/// <param name="goods_tag"></param>/// <param name="attach"></param>/// <returns></returns>private async Task<WebAPIResponse> Order(string appid, string openid, string mch_id, string out_trade_no, decimal total_fee, string nonce_str, string body, string goods_tag, string attach){try{//网页端调起支付API//https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6//统一下单//https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1var dict = new SortedDictionary<string, string>();dict.Add("appid", appid);dict.Add("openid", openid);dict.Add("mch_id", mch_id);dict.Add("nonce_str", nonce_str);dict.Add("out_trade_no", out_trade_no);//订单总金额,单位为分dict.Add("total_fee", Convert.ToInt32(total_fee * 100).ToString());//附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据dict.Add("attach", attach);dict.Add("body", body);dict.Add("trade_type", WxPayConfig.TRADETYPE);//终端IPdict.Add("spbill_create_ip", AbpConstants.Ip());dict.Add("notify_url", DbSetting.getAppText("NOTIFY_URL"));//商品标记,代金券或立减优惠功能的参数dict.Add("goods_tag", goods_tag);dict.Add("time_expire", DateTime.Now.AddMinutes(30).ToString("yyyyMMddHHmmss"));dict.Add("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));dict.Add("sign", WxPayConfig.GenerateSign(dict));string xml = "<xml>";foreach (var pair in dict){if (pair.Value.GetType() == typeof(int)){xml += "<" + pair.Key + ">" + pair.Value + "</" + pair.Key + ">";}else if (pair.Value.GetType() == typeof(string)){xml += "<" + pair.Key + ">" + "<![CDATA[" + pair.Value + "]]></" + pair.Key + ">";}}xml += "</xml>";logger.Info("OrdersController unifiedorder Req xml: " + xml);var data = await @"https://api.mch.weixin.qq.com/pay/unifiedorder".PostStringAsync(xml).ReceiveString();logger.Info("OrdersController unifiedorder Resp xml: " + data);if (data.IsNotNullOrEmpty() && data.Contains("SUCCESS", StringComparison.OrdinalIgnoreCase)){return new WebAPIResponse { IsError = false, Msg = "签名成功", Data = data.ConvertWeixinXmlToSortedDictionary() };}return new WebAPIResponse { IsError = true, Msg = "微信支付签名失败" };}catch (Exception ex){logger.Error("OrdersController unifiedorder Exception :" + ex.Message);return new WebAPIResponse { IsError = true, Msg = "微信支付签名失败" };}}#endregion#region 微信订单查询/// <summary>/// 微信订单查询/// </summary>/// <param name="appid">公众账号ID</param>/// <param name="mch_id">商户号</param>/// <param name="transaction_id">微信的订单号</param>/// <param name="out_trade_no">商户订单号</param>/// <param name="nonce_str">随机字符串</param>/// <param name="sign">签名</param>/// <returns></returns>private async Task<WebAPIResponse> Query(string appid, string mch_id, string transaction_id, string out_trade_no, string nonce_str, string sign){if (appid.IsEmpty() || mch_id.IsEmpty() || transaction_id.IsEmpty()){return new WebAPIResponse { IsError = true, Msg = "参数有误!!!" };}try{var dict = new Dictionary<string, string>();dict.Add("appid", appid);dict.Add("mch_id", mch_id);dict.Add("transaction_id", transaction_id);dict.Add("out_trade_no", out_trade_no);dict.Add("nonce_str", nonce_str);dict.Add("sign", sign);string xml = "<xml>";foreach (var pair in dict){if (pair.Value.GetType() == typeof(int)){xml += "<" + pair.Key + ">" + pair.Value + "</" + pair.Key + ">";}else if (pair.Value.GetType() == typeof(string)){xml += "<" + pair.Key + ">" + "<![CDATA[" + pair.Value + "]]></" + pair.Key + ">";}}xml += "</xml>";logger.Info("OrdersController WeixinNotify Req xml: " + xml);var data = await @"https://api.mch.weixin.qq.com/pay/orderquery".PostStringAsync(xml).ReceiveString();logger.Info("OrdersController WeixinNotify Resp xml: " + data);if (data.IsNotNullOrEmpty() && data.Contains("SUCCESS", StringComparison.OrdinalIgnoreCase)){return new WebAPIResponse { IsError = false, Data = "查询订单成功!!!" };}return new WebAPIResponse { IsError = true, Msg = "微信订单查询失败!!!" };}catch (Exception ex){logger.Error("OrdersController Exception :" + ex.Message);return new WebAPIResponse { IsError = true, Msg = ex.Message };}}#endregion

JS签名调起支付窗口

<script type="text/javascript">if (typeof WeixinJSBridge == "undefined") {if (document.addEventListener) {document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);} else if (document.attachEvent) {document.attachEvent('WeixinJSBridgeReady', onBridgeReady);document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);}} else {onBridgeReady();}@*@Html.Raw(Model.WeixinJsAPI)*@function onBridgeReady() {WeixinJSBridge.invoke('getBrandWCPayRequest', $.parseJSON(document.getElementById("WeixinJsAPI").value),function (data) {if (data.err_msg == 'get_brand_wcpay_request:ok') {window.location.href = ' @Url.Content("~/oauth/orders")';} else {$('.confirmbtn').removeAttr('disabled').css('background-color', '#80D200');}});}</script>

微信异步回调消息

         /// <summary>/// 微信支付异步通知/// </summary>/// <returns></returns>public async Task<ActionResult> Notify(){int intLen = Convert.ToInt32(Request.InputStream.Length);if (intLen <= 0){return Json(new { IsError = true, ErrorMsg = "没有微信支付异步参数!!! ", Data = string.Empty }, JsonRequestBehavior.AllowGet);}try{var dict = new SortedDictionary<string, string>();//dict = @"appid=wx0ae16b319cd984cf&attach=XXX&bank_type=CFT&cash_fee=1&fee_type=CNY&is_subscribe=Y&mch_id=1287151001&nonce_str=40f11a82cdde44588ec7d6b6bf9cca9d&openid=oxf8ns9AW1IwSwskzglgMH69t38o&out_trade_no=2015121621484780479309&result_code=SUCCESS&return_code=SUCCESS&sign=21C2A8727668E030BF801AB5B701BF93&time_end=20151216214906&total_fee=1&trade_type=JSAPI&transaction_id=1002230068201512162126471549".ConvertStringToSortedDictionary();var xmlDoc = new XmlDocument();xmlDoc.Load(Request.InputStream);var root = xmlDoc.SelectSingleNode("xml");XmlNodeList xnl = root.ChildNodes;foreach (XmlNode xnf in xnl){dict.Add(xnf.Name, xnf.InnerText);}if (dict.Count <= 0){return Json(new { IsError = true, ErrorMsg = "没有异步参数!!! ", Data = string.Empty }, JsonRequestBehavior.AllowGet);}logger.Info("【 WeixinController Notify SDKUtil.ConvertDictionaryToString : 请求报文=[" + dict.ConvertDictionaryToString() + "]\n");//验证签名string signK = WxPayConfig.GenerateSign(dict);if (signK != dict["sign"]){logger.Info("WeixinController Notify Verify WxSign Error : 请求报文=[signK " + signK + " : dict['sign'] " + dict["sign"] + "]\n");return Json(new { IsError = true, ErrorMsg = "验证签名失败 !!! ", Data = string.Empty }, JsonRequestBehavior.AllowGet);}//验证通信标识string return_code = dict["return_code"];if (!return_code.Equals("SUCCESS", StringComparison.OrdinalIgnoreCase)){string return_msg = dict["return_msg"];logger.Info("WeixinController Notify return_code Error : 请求报文=[" + return_code + " : " + return_msg + "]\n");return Json(new { IsError = true, ErrorMsg = "验证通信标识失败 !!! ", Data = string.Empty }, JsonRequestBehavior.AllowGet);}//验证交易标识[重要!!!]string result_code = dict["result_code"];if (!result_code.Equals("SUCCESS", StringComparison.OrdinalIgnoreCase)){string err_code = dict["err_code"];string err_code_des = dict["err_code_des"];logger.Info("WeixinController Notify return_code Error : 请求报文=[" + err_code + " : " + err_code_des + "]\n");return Json(new { IsError = true, ErrorMsg = "验证交易标识失败 !!! ", Data = string.Empty }, JsonRequestBehavior.AllowGet);}//公众账号IDstring appid = dict["appid"];//商户号string mch_id = dict["mch_id"];//随机字符串string nonce_str = dict["nonce_str"];//签名string sign = dict["sign"];//用户在商户appid 下的唯一标识string openid = dict["openid"];//用户是否关注公众账string is_subscribe = dict["is_subscribe"];//交易类型string trade_type = dict["trade_type"];//付款银行string bank_type = dict["bank_type"];//订单总金额[金额分转元]string total_fee = (float.Parse(dict["total_fee"]) / 100).ToString();//商户订单号string out_trade_no = dict["out_trade_no"];//微信支付订单号string transaction_id = dict["transaction_id"];//商家数据包string attach = dict["attach"];//支付完成时间string time_end = dict["time_end"];#region 微信订单查询【使用签名验证废弃】//var wxorder = await _weixinService.Query(WxPayConfig.KEY, WxPayConfig.APPID, WxPayConfig.MCHID, transaction_id, out_trade_no);#endregion//验证查询订单状态[R 预定状态  C 取消状态 P 支付完成  I 取单完成  D 送货状态]var order = await new SqlConnection(DbSetting.App).QueryAsync<Orders>(@"SELECT *FROM Orders WHERE OrderNo=@OrderNo", new { OrderNo = out_trade_no }).ContinueWith(t => t.Result.SingleOrDefault());if (order.IsNull() || order.Status.Trim() != "R" || order.TradeNO.IsNotNullOrEmpty() || order.PayFee.IsNotNullOrEmpty()){logger.Error("WeixinController Notify order Error xml : " + order.ToXml() + string.Format("  订单: {0} 信息不正确,如有疑问请联系客服!", out_trade_no));return Json(new { IsError = true, ErrorMsg = "验证查询订单状态失败 !!! ", Data = string.Empty }, JsonRequestBehavior.AllowGet);}using (var conn = new SqlConnection(DbSetting.App)){await conn.OpenAsync();var trans = conn.BeginTransaction();//记录微信异步信息var executeNum = await conn.ExecuteAsync(@"INSERT INTO PayNotify(openid,is_subscribe,trade_type,bank_type,transaction_id,out_trade_no,total_fee,coupon_fee,attach,memo,time_end,createtime)VALUES(@openid,@is_subscribe,@trade_type,@bank_type,@transaction_id,@out_trade_no,@total_fee,@coupon_fee,@attach,@memo,@time_end,@createtime)", new{openid = openid,is_subscribe = is_subscribe,trade_type = trade_type,bank_type = bank_type,transaction_id = transaction_id,out_trade_no = out_trade_no,total_fee = total_fee,coupon_fee = 0.0m,attach = attach,memo = dict.ConvertDictionaryToJson(),time_end = time_end,createtime = DateTime.Now}, trans);if (executeNum <= 0){trans.Rollback();return Json(new { IsError = true, ErrorMsg = "记录微信异步信息异常!!!", Data = string.Empty }, JsonRequestBehavior.AllowGet);}//更新订单支付信息executeNum = await conn.ExecuteAsync(@"UPDATE Orders SET Status = 'P', TradeNO = @TradeNO, PayFee = @PayFee, PayTime = GETDATE()", new{TradeNO = transaction_id,PayFee = total_fee,}, trans);if (executeNum <= 0){trans.Rollback();return Json(new { IsError = true, ErrorMsg = "更新订单支付信息异常!!!", Data = string.Empty }, JsonRequestBehavior.AllowGet);}//!!! 扣菜品库存
trans.Commit();}//构造成功XMLvar wxdict = new SortedDictionary<string, string>();wxdict.Add("return_code", "SUCCESS");wxdict.Add("return_msg", "PAY_SUCCESS");string wxRXml = wxdict.ConvertWxDictToString();logger.Info("WeixinController Notify Success wxRXml : " + wxRXml + " 】");return Content(wxRXml,@"text/xml",System.Text.Encoding.UTF8);}catch (Exception ex){logger.Fatal("WeixinController Notify Exception : " + ex.Message + " 】");return Json(new { IsError = true, ErrorMsg = "微信支付异常失败 !!! ", Data = string.Empty }, JsonRequestBehavior.AllowGet);}}

!!!注意事项

  • 支付授权目录与测试人的微信帐号白名单(出现access_denied或access_not_allow错误,请检查是否设置正确)
  • 支付授权目录区分大小写
  • 安全域名配置

转载于:https://www.cnblogs.com/Irving/p/5060147.html

关于微信开发与微信支付更新相关推荐

  1. 微信开发:微信js_sdk 分享,前端部分(二)

    微信开发:微信js-sdk前端分享,代码如下: <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"> ...

  2. 微信鉴权服务器地址,微信开发之微信授权登录

    本篇教程探讨了微信开发之微信授权登录,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入. < 应用场景是:用Hbuilder打包app,在app中点击微信授权登录或者某一操作, ...

  3. php 微信 语音,PHP语言微信开发:微信录音临时转永久存储

    本文主要向大家介绍了PHP语言微信开发:微信录音临时转永久存储,通过具体的内容向大家展示,希望对大家学习php语言有所帮助. 最近做开发的时候碰到了这个问题,甲方希望用户在微信端的录音能够一直有效.就 ...

  4. 微信开发 --- 调用微信上传图片接口,并保存到自己的服务器

    微信开发 - 调用微信上传图片接口,并保存到自己的服务器 整体思路是这样的: 1.先把手机上的图片上传到微信服务器,然后返回一个图片ID 2.在通过后台根据ID从微信后台拿到流,保存到服务器 前几个步 ...

  5. 微信jsapi支付获取code_微信开发之微信公众平台开发之JSAPI公众号支付

    本文将带你了解微信开发微信公众平台开发之JSAPI公众号支付,希望本文对大家学微信有所帮助. 一:配置参数 申请成功后,获取接口文件, 将所有文件放入项目根目录weixin下,在WxPay.ub.co ...

  6. 【融职培训】Web前端学习 第11章 微信开发5 微信支付

    一.概述 如果需要实现微信支付功能,需要有一个已认证的微信服务号,并且开通微信支付,开通后微信会提供一个商户ID.有了这个ID才能成功调用微信支付接口. 开通微信支付后,需要在微信支付后台[产品中心] ...

  7. 微信开发------------公众号支付统一下单整个流程

    申请微信支付在这里:https://blog.csdn.net/dmw412724/article/details/82735906 微信支付后台搭建(阅读本文的基础):https://blog.cs ...

  8. 【坑爹微信】微信开发基础 --- 微信快捷登陆问题解决

    目录 List 那一抹淡淡的忧伤-–微信开发基础 用纯js是不可能用纯js了,这辈子都不用纯js了 -– 微信JSSDK开发以及问题解答 要你命3000 -- 微信支付开发系列问题解决 导语 微信快捷 ...

  9. 微信开发,微信开发者平台

    微信小程序 小程序介绍 微信小程序是一种全新的连接用户端与服务端的方式. 小程序可以在微信内被便捷地获取和传播. 小程序具有出色的用户体验. ###为什么要学习小程序 微信小程序开发成本低.使用方便. ...

最新文章

  1. python二分法查找算法_顺序查找算法和折半(二分法)查找算法,C语言查找算法详解...
  2. 关于numy中np.expand_dims方法的理解?
  3. 5分钟实现Android中更换头像功能
  4. python3.6安装scrapy-python3.6 安装scrapy
  5. 如何让关键词进入百度相关搜索列表?
  6. 手写简版spring --1--创建简单的Bean容器
  7. 怎么在前台取的ViewBag中的值
  8. python将list转为数组_python如何将list中的字符转为数字
  9. 欢迎加入我们的架构师社群
  10. mysql中like,limit,union及union all查询
  11. rand()函数实现原理:线性同余法
  12. xrd连续扫描和步进扫描_深度解析XRD
  13. u盘盘符不显示 win10_win10系统u盘不显示盘符的解决方法
  14. 最常见的管理误区,你中招了吗?
  15. You earned your Program Management Professional (PgMP)® Credential
  16. Pytorch学习笔记7——自定义数据集
  17. Oracle表空间查询
  18. 计算机组成原理复习要点与考题类型--选择-填空-分析-计算-简答
  19. 学校计算机的使用英语作文180字,英文作文学生开车去学校,180字
  20. spring boot 项目 事务 不能回滚 代理(not eligible for auto-proxying)

热门文章

  1. php 正则xml文件,php 读取xml的方法三---用php正则表达式来记取数据
  2. TCP通信之获取本机IPV4地址
  3. 西门子for循环例子_理解JavaScript中的循环缺陷和迭代协议
  4. android 模拟crash_Android 收集Crash信息及用户操作步骤
  5. mock java 反射,PowerMock,Mockito和反射api的最终类
  6. ios如何看idfv_ios获取手机状态 idfa   idfv   网络类型   分辨率   获取运营商
  7. Hash(除留余数法+链地址法)
  8. Hadoop系列之Aggregate用法
  9. Python风格总结:Python基础-类变量和实例变量
  10. 基于QStyledItemDelegate的例子 Star Delegate Example