巅云智能建站平台搭建版(创业流派版)火爆上线,毕生受权!新增:文章智能收罗+全站真静态打包+都会分站+智能小法式+不法词过滤+H5自顺应+智能链词等功效功效概况
建站资讯News

微信公家号开辟之公家号付出

0
一佰互联网站扶植(www.taishanly.com) 宣布时辰:2020-04-01 22:34:21 阅读数: 84

简介:明天,咱们接着讲微信付出的系列教程,前面,咱们讲了这个微信红包和扫码付出。此刻,咱们讲讲这个公家号付出。公家号付出的操纵情况罕见的用户经由进程公家号,而后再经由进程公家号外面的菜单链接,进入公家号的商城,而后 ...

明天,咱们接着讲微信付出的系列教程,前面,咱们讲了这个微信红包和扫码付出。此刻,咱们讲讲这个公家号付出。公家号付出的操纵情况罕见的用户经由进程公家号,而后再经由进程公家号外面的菜单链接,进入公家号的商城,而后在外面完成采办和付出功效,咱们能够看看官方对这个公家号付出的场景的诠释,链接:http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1,经由进程这个官方的诠释,那咱们大要清晰这个公家号的用处了,上面,我就说说,做这个公家号付出的筹办任务有哪些了。 1、下载微信web开辟者工具,工具的操纵体例,也看链接,地点:http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1455784140&token=&lang=zh_CN 2、设置装备摆设“微信付出”情况,以下图: 3、受权取得用户信息,以下图: 上面起头,一步一步往下走。 一、咱们先开辟法式,起首,新建一个MVC工程(asp.net的话,官方给的demo便是asp.net的,能够下载来参考:http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1),名为:微信付出之公家号付出,以下图: 而后右键名目,咱们点窜一部属性,以下图:而后咱们再把法式主动天生的HomeController.cs和View外面的删掉,再新建一个HomeController.cs和增加View,代码以下:using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;namespace Web.Controllers{ public class HomeController : Controller { // GET: Home public ActionResult Index() { return View(); } }} View代码:@{ Layout = null;}<!DOCTYPE html><html><head> <meta name="viewport" content="width=device-width" /> <title>Index</title></head><body> <div> </div></body></html> 嗯,没错,今朝仍是空的,此刻咱们起头写前台,代码以下(我先贴上代码,后续再诠释为啥这么做,由于若是一步步的写下去,根据前面两个的篇幅来,我感觉都能够开课了,以是,我先上代码,而后再一步步诠释。): @{ Layout = null;}<!DOCTYPE html><html><head> <meta name="viewport" content="width=device-width" /> <title>电表充值办事</title> <link href="~/Scripts/jquery-easyui-1.4.5/themes/bootstrap/easyui.css" rel="stylesheet" /> <link href="~/Scripts/jquery-easyui-1.4.5/themes/mobile.css" rel="stylesheet" /> <link href="~/Scripts/jquery-easyui-1.4.5/themes/icon.css" rel="stylesheet" /> <style type="text/css"> body{ margin:0; padding:0; } .logo { width: 100%; height: 70px; background: url(/Images/EleLogo.png) 0 0 no-repeat; background-size: 100% 100%; padding: 0; margin: 0; } .line { width: 100%; float: left; height: auto; text-align: center; margin-top: 10px; } .lineText { width: 100%; float: left; height: auto; text-indent: 5%; text-align: left; font-size: x-large; margin: 0; } .function { height: 60pt; line-height: 60pt; width: 45%; float: left; border-radius: 10px; background-color: #990000; margin-left: 8pt; } .title { font-family: "微软雅黑"; font-size: x-large; color: white; } a { text-decoration: none; color: white; } input { vertical-align: central; } label { vertical-align: central; } .lbBlock { border: 1px solid #808080; background-color: grey; width: 90%; margin-left: 5%; font-size: x-large; border-radius: 10px; text-align: left; text-indent: 10pt; height: 30pt; padding-top: 5pt; } .btn { width: 90%; height: 35pt; font-size: x-large; background-color: #990000; color: white; background: url(/Images/red.png) 0 0 repeat; border: none; border-radius: 10px; margin: 10px 0 0 0; } .input { height: 30pt; width: 90%; font-size: x-large; border-radius: 10px; margin: 0; padding: 0; } </style></head><body> <div class="logo"> </div> <form id="ChargeForm"> <div class="line"> <div class="lineText"> 充值金额: </div> </div> <div class="line"> <input type="number" id="ChargeVal" name="ChargeVal" class="input" placeholder="单元:元" /> </div> </form> <div class="line"> <input type="button" class="btn" value="当即充值" onclick="fCharge()" style="margin-top: 20px;" /> </div> <div class="line"> <input type="button" id="btnHome" class="btn" value="前往主页" onclick="fBackHome()" /> </div> <script src="~/Scripts/jquery-easyui-1.4.5/jquery.min.js"></script> <script src="~/Scripts/jquery-easyui-1.4.5/jquery.easyui.min.js"></script> <script src="~/Scripts/jquery-easyui-1.4.5/jquery.easyui.mobile.js"></script> <script src="~/Scripts/jquery-easyui-1.4.5/easyloader.js"></script> <script type="text/javascript"> $(function () { var vCode = getQueryString("code"); if (vCode != "" && vCode != null) { //alert(vCode); $.ajax({ type: "post", data: { code: vCode }, url: "/Home/getWxInfo", success: function (sjson) { //alert(sjson); //var vData = JSON.stringify(sjson); //alert(vData); $.messager.show({ title: "提醒", msg: "接待您离开微信端充值中间。" }); } }) } else { $.ajax({ type: "post", url: "/Home/getCode", success: function (sjson) { //alert(sjson); location.href = sjson; } }) } }) //取得url的参数 function getQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); var r = window.location.search.substr(1).match(reg); if (r != null) return unescape(r[2]); return null; } //初始化微信付出情况 function fCharge() { 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 { fPostCharge(); } } //提交充值数据 function fPostCharge() { var vChargeVal = $("#ChargeVal").val(); vChargeVal = parseFloat(vChargeVal); if (vChargeVal > 0) { $.messager.progress({ title: "", msg: "正在挪用微信付出接口,请稍后..." }); $.ajax({ type: "post", data: "totalfee=" + vChargeVal, url: "/Home/MeterRecharge", success: function (json) { $.messager.progress("close");//记得封闭 //var json = eval("(" + msg + ")");//转换后的JSON工具 onBridgeReady(json); }, error: function () { $.messager.progress("close");//记得封闭 $.messager.alert("提醒", "挪用微信付出模块失利,请稍后再试。", "info") } }) } else { alert("房间名或充值金额不能够为空或为正数,请确认后再试.") } } //挪用微信付出模块 function onBridgeReady(json) { WeixinJSBridge.invoke( "getBrandWCPayRequest", { "appId": json.appId, //公家号称号,由商户传入 "timeStamp": json.timeStamp, //时辰戳,自1970年以来的秒数 "nonceStr": json.nonceStr, //随机串 "package": json.packageValue, "signType": "MD5", //微信署名体例: "paySign": json.paySign //微信署名 }, function (res) { if (res.err_msg == "get_brand_wcpay_request:ok") { //alert("付出胜利,请稍后查问余额,若有疑难,请接洽办理员."); fAlreadyPay(); } // 操纵以上体例判定前端前往,微信团队慎重提醒:res.err_msg将在用户付出胜利后前往 ok,但并不保障它相对靠得住。 } ); } function fBackHome() { location.href = "/"; } </script></body></html>背景代码以下:using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;using Web.Models;using WxPayAPI;namespace Web.Controllers{ public class HomeController : Controller { JsApiPay jsApiPay = new JsApiPay(); // GET: Home public ActionResult Index() { if (Session["openid"] == null) { try { //挪用【网页受权取得用户信息】接口取得用户的openid和access_token GetOpenidAndAccessToken(); } catch (Exception ex) { //Response.Write(ex.ToString()); //throw; } } return View(); } /** * * 网页受权取得用户根基信息的全数进程 * 概况请参看网页受权取得用户根基信息:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html * 第一步:操纵url跳转取得code * 第二步:操纵code去取得openid和access_token * */ public void GetOpenidAndAccessToken() { if (Session["code"] != null) { //取得code码,以取得openid和access_token string code = Session["code"].ToString(); Log.Debug(this.GetType().ToString(), "Get code : " + code); jsApiPay.GetOpenidAndAccessTokenFromCode(code); } else { //机关网页受权取得code的URL string host = Request.Url.Host; string path = Request.Path; string redirect_uri = HttpUtility.UrlEncode("http://" + host + path); //string redirect_uri = HttpUtility.UrlEncode("http://gzh.lmx.ren"); 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 = "http://open.weixin.qq.com/connect/oauth2/authorize?" + data.ToUrl(); Log.Debug(this.GetType().ToString(), "Will Redirect to URL : " + url); Session["url"] = url; } } /// <summary> /// 取得code /// </summary> /// <returns></returns> [HttpPost] public ActionResult getCode() { object objResult = ""; if (Session["url"] != null) { objResult = Session["url"].ToString(); } else { objResult = "url为空。"; } return Json(objResult); } /// <summary> /// 经由进程code调换网页受权access_token和openid的前往数据 /// </summary> /// <returns></returns> [HttpPost] public ActionResult getWxInfo() { object objResult = ""; string strCode = Request.Form["code"]; if (Session["access_token"] == null || Session["openid"] == null) { jsApiPay.GetOpenidAndAccessTokenFromCode(strCode); } string strAccess_Token = Session["access_token"].ToString(); string strOpenid = Session["openid"].ToString(); objResult = new { openid = strOpenid, access_token = strAccess_Token }; return Json(objResult); } /// <summary> /// 充值 /// </summary> /// <returns></returns> [HttpPost] public ActionResult MeterRecharge() { object objResult = ""; string strTotal_fee = Request.Form["totalfee"]; string strFee = (double.Parse(strTotal_fee) * 100).ToString(); //若通报了相干参数,则调同一下单接口,取得后续相干接口的进口参数 jsApiPay.openid = Session["openid"].ToString(); jsApiPay.total_fee = int.Parse(strFee); //JSAPI付出预处置 try { string strBody = "南宫萧尘微信付出";//商品描写 WxPayData unifiedOrderResult = jsApiPay.GetUnifiedOrderResult(strBody); WxPayData wxJsApiParam = jsApiPay.GetJsApiParameters();//取得H5调起JS API参数,注重,这里援用了官方的demo的体例,由于原体例是前往string的,以是,要对原体例改成上面的代码,代码鄙人一段 ModelForOrder aOrder = new ModelForOrder() { appId = wxJsApiParam.GetValue("appId").ToString(), nonceStr = wxJsApiParam.GetValue("nonceStr").ToString(), packageValue = wxJsApiParam.GetValue("package").ToString(), paySign = wxJsApiParam.GetValue("paySign").ToString(), timeStamp = wxJsApiParam.GetValue("timeStamp").ToString(), msg = "胜利下单,正在接入微信付出." }; objResult = aOrder; } catch (Exception ex) { ModelForOrder aOrder = new ModelForOrder() { appId = "", nonceStr = "", packageValue = "", paySign = "", timeStamp = "", msg = "下单失利,请重试,屡次失利,请接洽办理员." }; objResult = aOrder; } return Json(objResult); } }} 这里便是上面点窜了的代码,童鞋们请注重 /** * * 从同一下单胜利前往的数据中取得微信阅读器调起jsapi付出所需的参数, * 微信阅读器调起JSAPI时的输出参数格局以下: * { * "appId" : "wx2421b1c4370ec43b", //公家号称号,由商户传入 * "timeStamp":" 1395712654", //时辰戳,自1970年以来的秒数 * "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串 * "package" : "prepay_id=u802345jgfjsdfgsdg888", * "signType" : "MD5", //微信署名体例: * "paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信署名 * } * @return string 微信阅读器调起JSAPI时的输出参数,json格局能够间接做参数用 * 更详细的申明请参考网页端调起付出API:http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7 * */ public WxPayData 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 jsApiParam; }ModelForOrder类的代码:using System;using System.Collections.Generic;using System.Linq;using System.Web;namespace Web.Models{ public class ModelForOrder { public string appId { get; set; } public string timeStamp { get; set; } public string nonceStr { get; set; } public string packageValue { get; set; } public string paySign { get; set; } public string msg { get; set; } }} 另有一个处所须要注重,点窜一下的便是这里WxLib/business/JsApiPay.cs,以下图:最初,把法式宣布出来,此次咱们把Web宣布在http://gzh.lmx.ren上 ,而后再把接口权限,改成如许的,以下图: 注重,这外面的域名和上面咱们宣布的域名要分歧。 除此之外,咱们还须要改这里: 便是必然要受权这里,不然,付出的时辰,会提醒其余毛病,详细,我就不测试了。 别的,这里实在已完成了这个公家号的付出的流程了,可是,咱们页面上,会和睦的提醒(实在不和睦,提醒是白色的,在头部,提醒别输出暗码甚么),这是由于,咱们还没把咱们这个http://gzh.lmx.ren域名设置为宁静域名,设置以后,就不会在提醒了。设置体例以下图:在这外面插手咱们的域名,就完善了。。。 我的代码都尽可能精简,过剩的,我都会丢掉,便是为了避免混合视听。若是代码外面,有写的不清晰的,能够私信问我,或群里来问我,群号在文章结尾。此刻,我起头逐一诠释我上面的做法。 起首,在后端,页面加载的时辰,他会先履行public ActionResult Index() { if (Session["openid"] == null) { try { //挪用【网页受权取得用户信息】接口取得用户的openid和access_token GetOpenidAndAccessToken(); } catch (Exception ex) { //Response.Write(ex.ToString()); //throw; } } return View(); } 这外面便是为了取得用户的Openid和Access_token,这个用处很大,另有便是,咱们经由进程代码能够晓得,咱们经由进程这个体例,能够取得到微信的一些相干信息,取得完了以后,他会前往到咱们的页面下去,url就存在一个session外面,以下:Session["url"] = url; 接着,在前端: 当页面加载终了以后,会履行以下JS体例,以下: $(function () { var vCode = getQueryString("code"); if (vCode != "" && vCode != null) { //alert(vCode); $.ajax({ type: "post", data: { code: vCode }, url: "/Home/getWxInfo", success: function (sjson) { //alert(sjson); //var vData = JSON.stringify(sjson); //alert(vData); $.messager.show({ title: "提醒", msg: "接待您离开微信端充值中间。" }); } }) } else { $.ajax({ type: "post", url: "/Home/getCode", success: function (sjson) { //alert(sjson); location.href = sjson; } }) } }) 他会先取得阅读器的url,而后取得code,便是普通url前面的xxx.com?code=xxx,这外面便是起首判定有不code,若是不code,则,咱们去背景要求这个code。为甚么要求这个code呢?咱们来看这个体例: getWxInfo,以下图: /// <summary> /// 取得code /// </summary> /// <returns></returns> [HttpPost] public ActionResult getCode() { object objResult = ""; if (Session["url"] != null) { objResult = Session["url"].ToString(); } else { objResult = "url为空。"; } return Json(objResult); } 他就会前往url到前端,前端经由进程js去拜候阿谁网址,阿谁网址便是微信端取得到咱们的信息以后,给咱们根据法则再前往一个url,这rul便是咱们前面须要后去的code的url。这个code对咱们相当首要,由于前面咱们要做跟付出有关的任务,都用到的。有了code,咱们能力拿到openid和access_token。详细看代码逻辑也能够了然。 好,走到这一步,咱们已晓得openid和access_token了,这个时辰,咱们就担任处置前真个工具。 前端,我就一个金额输出框,而后一个提交,现实操纵中,咱们必定还须要传入商品的参数,我这外面就不写那些过剩的了,后续你们本身加出来就能够了。这外面在点击提交的时辰,会挪用微信的情况,看上面的代码: //初始化微信付出情况 function fCharge() { 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 { fPostCharge(); } } 他会初始化一下情况,若是初始化胜利,代表,这个页面是在微信客户端外面运转的,那末咱们就给他运转咱们真实的充值代码提交,以是,就会履行:fPostCharge();提交以后,就会进入背景,背景须要构造咱们前台须要用到的参数,此中包含以下:/// <summary> /// 充值 /// </summary> /// <returns></returns> [HttpPost] public ActionResult MeterRecharge() { object objResult = ""; string strTotal_fee = Request.Form["totalfee"]; string strFee = (double.Parse(strTotal_fee) * 100).ToString(); //若通报了相干参数,则调同一下单接口,取得后续相干接口的进口参数 jsApiPay.openid = Session["openid"].ToString(); jsApiPay.total_fee = int.Parse(strFee); //JSAPI付出预处置 try { string strBody = "南宫萧尘微信付出";//商品描写 WxPayData unifiedOrderResult = jsApiPay.GetUnifiedOrderResult(strBody); WxPayData wxJsApiParam = jsApiPay.GetJsApiParameters();//取得H5调起JS API参数 ModelForOrder aOrder = new ModelForOrder() { appId = wxJsApiParam.GetValue("appId").ToString(), nonceStr = wxJsApiParam.GetValue("nonceStr").ToString(), packageValue = wxJsApiParam.GetValue("package").ToString(), paySign = wxJsApiParam.GetValue("paySign").ToString(), timeStamp = wxJsApiParam.GetValue("timeStamp").ToString(), msg = "胜利下单,正在接入微信付出." }; objResult = aOrder; } catch (Exception ex) { ModelForOrder aOrder = new ModelForOrder() { appId = "", nonceStr = "", packageValue = "", paySign = "", timeStamp = "", msg = "下单失利,请重试,屡次失利,请接洽办理员." }; objResult = aOrder; } return Json(objResult); } 咱们首要须要供给的便是这个类ModelForOrder 外面的参数,而后再把这些参数前往给前台挪用,以下: //挪用微信付出模块 function onBridgeReady(json) { WeixinJSBridge.invoke( "getBrandWCPayRequest", { "appId": json.appId, //公家号称号,由商户传入 "timeStamp": json.timeStamp, //时辰戳,自1970年以来的秒数 "nonceStr": json.nonceStr, //随机串 "package": json.packageValue, "signType": "MD5", //微信署名体例: "paySign": json.paySign //微信署名 }, function (res) { if (res.err_msg == "get_brand_wcpay_request:ok") { //alert("付出胜利,请稍后查问余额,若有疑难,请接洽办理员."); fAlreadyPay(); } // 操纵以上体例判定前端前往,微信团队慎重提醒:res.err_msg将在用户付出胜利后前往 ok,但并不保障它相对靠得住。 } ); } 如许,他就会弹出一个微信付出的窗口,以下:而后咱们确认付款以后,是不是付款胜利,若是付款胜利,咱们在履行: fAlreadyPay();这个体例已被我删掉了,用处是用于,咱们收到用户的款以后,咱们须要同步一些数据到咱们的数据库外面去,以是,该怎样操纵,本身自行点窜了。原文地点:http://www.cnblogs.com/nangong/p/50ab3c60f0d1ae5b551373cf96cd060d.html__EOF__原作 者:潇十一郎版权一切:原作者出 处:http://www.cnblogs.com/zhangxiaoyong/p/9269034.html

微信公家号开辟之公家号付出

本文仅代表作者小我概念,不代表巅云官方发声,对概念有疑义请先接洽作者本身停止点窜,若内容不法请接洽平台办理员,邮箱2522407257@qq.com。更多相干资讯,请到巅云www.taishanly.com进修互联网营销手艺请到巅云建站www.yx10011.com。
一佰互联是天下着名建站品牌办事商,咱们有九年、网站建造、网页设想、php开辟和域名注册及假造主机办事经历,供给的办事更是天下着名。最近几年来还整合团队上风自立开辟了可视化多用户”“3.0平台版,拖拽排版网站建造设想,轻松完成pc站、手机微网站、小法式、APP一体化全网营销网站扶植 ,已胜利的为天下上百家收集公司供给自助建站平台搭建办事。更多资讯:tags标签

上一篇:青海副省长回应自掏千元嘉奖风险驾驶爆料人:交通宁静是重头戏
下一篇: 甘肃省14个市州当局网站绩效总排名 兰州陇南并列第一
[前往消息列表]

相干消息more

12
05月
专业网站扶植开辟一片新的收集情况

咱们都存在于如许一个不时成长的社会系统中,咱们的糊口程度也在不时的进步。对收集的呈现和被操纵是咱们糊口的最大好处地点。对收集来讲。网站制... >>概况

01
05月
PHP的口试题集

口试题1 1、用PHP打印出前一天的时辰格局是2006-5-1022:21:21 2、echo(),print(),print_r()的区分... >>概况

27
04月
CI(CodeIgniter)简略统计拜候人

本文实例报告了CI(CodeIgniter)简略统计拜候人数完成体例。分享给大师供大师参考,详细以下:空话不说,先上代码:节制器文件:/ap... >>概况

30
04月
php中json_encode中文编码题目分

比方:"胥"颠末json_encode处置后变为"u80e5",终究的json中中文局部被替代为unicode编码。咱们要处理的便是将工具转... >>概况

高端网站扶植

美工统筹SEO,为企业电子商务营销助力!

德律风:

023-85725751