vue开发微信公众号--开发准备
<p>由于工作项目的原因,需要使用vue开发微信公众号,但是这种微信公众号更多是将APP套了一个微信的壳子,除了前面的授权和微信有关系以外,其他的都和微信没多大的关系了,特此记录</p><h2>开发流程</h2>
<p>首先需要在电脑上安装微信web开发者工具和花生壳(内网穿透),然后有一个微信公众平台的账号</p>
<h3>第一步:</h3>
<p>下载安装花生壳,点击内网穿透</p>
<p><img src="https://img2018.cnblogs.com/blog/1304208/201905/1304208-20190507114609091-438630830.png"></p>
<p>然后会在浏览器中打开下面这个界面</p>
<p><img src="https://img2018.cnblogs.com/blog/1304208/201905/1304208-20190507114752852-898824733.png"></p>
<p>这里需要注意的是外网访问地址和内网主机地址。</p>
<h3>第二步:</h3>
<p>登录微信公众平台后,滚动页面到最下面,点击开发下面的开发者工具。</p>
<p><img src="https://img2018.cnblogs.com/blog/1304208/201905/1304208-20190507115010381-468906696.png"></p>
<p>然后选择公众平台测试账号,会新打开一个测试号管理的页面</p>
<p><img src="https://img2018.cnblogs.com/blog/1304208/201905/1304208-20190507115057267-2056074971.png"></p>
<p>在测试号管理页面,需要修改两个地方,将地址换成第一步中的外网访问地址:</p>
<p>第一个:</p>
<p><img src="https://img2018.cnblogs.com/blog/1304208/201905/1304208-20190507115557537-1391957459.png"></p>
<p>第二个(此时不需要前面的http://):</p>
<p><img src="https://img2018.cnblogs.com/blog/1304208/201905/1304208-20190507115632134-1302630921.png"></p>
<p><img src="https://img2018.cnblogs.com/blog/1304208/201905/1304208-20190507115647819-988775111.png"></p>
<p>除了修改上面两个地方以外,作为测试号,还需要将当前页面前面的测试号信息发给后台</p>
<p><img src="https://img2018.cnblogs.com/blog/1304208/201905/1304208-20190507115909586-1492346869.png"></p>
<p>现在,前台的基本配置已经完成了。</p>
<h2> 项目配置</h2>
<h3>第一步:</h3>
<p>首先需要创建项目,和创建其他的vue项目一模一样,直接使用脚手架创建就可以了。</p>
<p>项目创建完成后,需要安装微信的SDK:<code class="bash plain">npm </code><code class="bash functions">install</code> <code class="bash plain">weixin-js-sdk --save</code><br></p>
<p>另外,由于vue项目默认是使用localhost打开的,但是这样是微信公众号,需要在微信web开发者工具中打开,所以需要更改为通过ip访问:</p>
<p>打开根目录下的config/index.js,修改文件内dev里面的host和port</p>
<p><img src="https://img2018.cnblogs.com/blog/1304208/201905/1304208-20190507135315671-857374281.png"></p>
<p>这里的地址应该是电脑的IP,端口是可以自定义的,修改完成后,需要修改第一步花生壳中的那个内网主机,让两者保持一致。</p>
<p>现在,启动项目,在浏览器中输入192.168.0.3:8080如果可以打开项目的话,那么项目创建就没有问题了。</p>
<p>由于使用花生壳穿透以后,192.168.0.3:8080对应的就是花生壳里面的外网访问地址,所以打开微信web开发者工具,输入穿透后的外网访问地址,也是可以打开项目的。</p>
<h2>第二步:</h2>
<p>在进行授权前,需要获取code,然后通过code去到后台换取openID。由于在本项目中采用的是强制授权,分别写了两个页面:login和getCode用于进行授权:</p>
<p>login.vue是项目的默认显示页面</p>
<div class="cnblogs_code">
<pre><template>
<div class="hello"></div>
</template>
<script><span style="color: rgba(0, 0, 0, 1)">
import </span>* as sessiondate from '../service/staticData'<span style="color: rgba(0, 0, 0, 1)">
import { Indicator } from </span>'mint-ui'<span style="color: rgba(0, 0, 0, 1)">;
import { mapMutations,mapState } from </span>'vuex'<span style="color: rgba(0, 0, 0, 1)">
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> {
data () {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> {
msg: </span>'Welcome to Your Vue.js App'<span style="color: rgba(0, 0, 0, 1)">
}
},
created(){
window.location.href</span>=<span style="color: rgba(0, 0, 0, 1)">sessiondate.weixin;
},
methods: {}
}
</span></script>
<style scoped>
</style></pre>
</div>
<p>其中的sessiondate.weixin是自己配置的。</p>
<p>staticData.js</p>
<div class="cnblogs_code">
<pre>export const weixin='https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx503236dfa82f2a64&redirect_uri=http%3A%2F%2F2ir3745783.zicp.vip%2f%23%2fgetCode&response_type=code&scope=snsapi_base&state=STATE&connect_redirect=1#wechat_redirect'</pre>
</div>
<p>其中appid=wx503236dfa82f2a64是测试号管理中的appId,redirect_uri=http%3A%2F%2F2ir3745783.zicp.vip%2f%23%2fgetCode则表示的是获取code的页面,也就是上面说的getCode.vue这个页面的访问路径,然后通过了转码。</p>
<p>当项目启动,进入login页面后,就会自动执行生命周期函数里面的代码,页面就会跳转到getCode.vue页面。</p>
<p>getCode.vue</p>
<div class="cnblogs_code">
<pre><template>
<div class="hello"></div>
</template>
<script><span style="color: rgba(0, 0, 0, 1)">
import </span>* as apidate from "../service/api"<span style="color: rgba(0, 0, 0, 1)">;
import { Indicator } from </span>"mint-ui"<span style="color: rgba(0, 0, 0, 1)">;
import { mapMutations, mapState } from </span>"vuex"<span style="color: rgba(0, 0, 0, 1)">;
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> {
data() {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> {
msg: </span>"Welcome to Your Vue.js App"<span style="color: rgba(0, 0, 0, 1)">
};
},
created() {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 'snake'、'fading-circle'、'double-bounce'、'triple-bounce'</span>
<span style="color: rgba(0, 0, 0, 1)"> Indicator.open({
text: </span>"Loading..."<span style="color: rgba(0, 0, 0, 1)">,
spinnerType: </span>"triple-bounce"<span style="color: rgba(0, 0, 0, 1)">
});
</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.Code();
},
methods: {
getQueryString(name) {
</span><span style="color: rgba(0, 0, 255, 1)">var</span> reg = <span style="color: rgba(0, 0, 255, 1)">new</span> RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> r = window.location.search.substr(1<span style="color: rgba(0, 0, 0, 1)">).match(reg);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (r != <span style="color: rgba(0, 0, 255, 1)">null</span>) <span style="color: rgba(0, 0, 255, 1)">return</span> unescape(r);
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
},
Code() {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.$store.commit("changeToken", <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.$store.commit("changeCode", <span style="color: rgba(0, 0, 255, 1)">this</span>.getQueryString("code"<span style="color: rgba(0, 0, 0, 1)">));
</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.axios
.get(apidate.getOpenId1 </span>+ "?code=" + <span style="color: rgba(0, 0, 255, 1)">this</span>.getQueryString("code"<span style="color: rgba(0, 0, 0, 1)">))
.then(res </span>=><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (res.data.msg == "bind"<span style="color: rgba(0, 0, 0, 1)">) {
Indicator.close();
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.$store.commit("changeOpenId"<span style="color: rgba(0, 0, 0, 1)">,res.data.data);
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.$router.push("bind"<span style="color: rgba(0, 0, 0, 1)">);
} </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (res.data.msg == "newtoken"<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.$store.commit("changeToken"<span style="color: rgba(0, 0, 0, 1)">, res.data.data.token.access_token);
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.$store.commit("changeUserInfo"<span style="color: rgba(0, 0, 0, 1)">, res.data.data.user);
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.$store.commit("changeOpenId"<span style="color: rgba(0, 0, 0, 1)">,res.data.data.user.openId);
Indicator.close();
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.$router.push("home"<span style="color: rgba(0, 0, 0, 1)">);
}
})
.</span><span style="color: rgba(0, 0, 255, 1)">catch</span>(err =><span style="color: rgba(0, 0, 0, 1)"> {});
}
}
};
</span></script>
<style scoped>
</style></pre>
</div>
<p>路由跳转到这个页面后,地址栏里面就会带有code,我们需要拿到这个code,然后去后台换取openid和其他的信息。由于这个过程需要时间,因此在页面进入时,默认显示一个加载圈。</p>
<p> <img src="https://img2018.cnblogs.com/blog/1304208/201905/1304208-20190507142457774-2120719850.png"></p>
<p>获取code</p>
<p><img src="https://img2018.cnblogs.com/blog/1304208/201905/1304208-20190507142549499-171197983.png"></p>
<p><img src="https://img2018.cnblogs.com/blog/1304208/201905/1304208-20190507142629417-978780903.png"></p>
<p>通过code去后台换取openID</p>
<p><img src="https://img2018.cnblogs.com/blog/1304208/201905/1304208-20190507142719011-1472679191.png"></p>
<p>前面两行是为了存数据的,暂时可以不用看,这里主要是拿到code以后,去后台换取openID,然后根据后台的返回,判断页面跳转(我们公司做了一个用户绑定,所以后台会根据这个接口判断当前用户是否进行了绑定:如果已经绑定,则直接跳转到内容主页面;如果没有绑定,则跳转到用户绑定页面)</p>
<p> 完成了授权以后,后面的就和常规的vue项目一样的处理就可以了。</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/yuyujuan/p/10824476.html
頁:
[1]