<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>playmonkey (zyj)</title>
    <link>https://ruby-china.org/playmonkey</link>
    <description>there is not only about coding.</description>
    <language>en-us</language>
    <item>
      <title>[微信开发] 开发环境搭建</title>
      <description>&lt;p&gt;由于微信开发都是在微信内浏览器运行，不管是登陆还是支付都不能在 PC 开发端愉快地玩耍，但世界我们还是需要拯救的。&lt;/p&gt;

&lt;p&gt;由于自己换了新电脑，第一次做微信开发跟大家分享一下我的开发环境，欢迎拍砖交流。&lt;/p&gt;

&lt;p&gt;一般的第三方开发永远离不开两个配置，域名 &amp;amp; 回调，有一些平台支持 localhost 的域名&amp;amp;回调会方便，更有支持随意更改端口的，微信上面貌似都没有 &lt;img title=":anger:" alt="💢" src="https://twemoji.ruby-china.com/2/svg/1f4a2.svg" class="twemoji"&gt;。&lt;/p&gt;

&lt;p&gt;好了，假定我们的域名是 playmonkey.me&lt;/p&gt;
&lt;h2 id="域名"&gt;域名&lt;/h2&gt;
&lt;hr&gt;

&lt;p&gt;微信登陆，JSAPI 以及支付都有域名限制，所以需要让手机微信上打开 palymonkey.me 时，访问到我们本地的 development server。&lt;/p&gt;

&lt;p&gt;干这个勾当的当属 Charles 神器。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;下载安装打开 Charles&lt;/li&gt;
&lt;li&gt; &lt;code&gt;Proxy -&amp;gt; Proxy Setting -&amp;gt; Http Proxy&lt;/code&gt;勾选 Enable.... 开启 http proxy 代理，端口默认是 8888&lt;/li&gt;
&lt;li&gt; &lt;code&gt;Tool -&amp;gt; DNS Spoofing Settings&lt;/code&gt; 勾选 Enable DNS Spoofing&lt;/li&gt;
&lt;li&gt; 然后把 palymonkey.me 加到 DNS Spoofs，指向本机 127.0.0.1&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Charles 好了，下一步配置手机，确保你的手机网络和电脑在同一局域网，配置手机的 HTTP 代理到电脑的 IP 上，端口 8888；&lt;/p&gt;

&lt;p&gt;访问&lt;code&gt;http://playmonkey.me&lt;/code&gt;；&lt;/p&gt;

&lt;p&gt;什么？挂了？当然，酱紫访问的是本地的 80 端口。&lt;/p&gt;

&lt;p&gt;好了，我们再来用 Nginx 反向代理搞定这个问题，让手机端的 playmonkey.me 访问到本地 development server 的 3000 端口上。&lt;/p&gt;

&lt;p&gt;首先安装启动 Nginx，用 Apache 的朋友对不起了，你们要自食其力 XD&lt;/p&gt;

&lt;p&gt;配置 Nginx&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;server {
      listen 80;
      server_name playmonkey.me;
      charset utf-8;
      location / {
        proxy_pass          http://monkey_servers;
        proxy_redirect      default;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header    X-Real-IP $remote_addr;
        proxy_set_header    Host $http_host;
        proxy_next_upstream http_502 http_504 error timeout invalid_header;

      }

    }
    upstream palymonkey_servers{
      server 127.0.0.1:3000;
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再用手机访问&lt;code&gt;http://playmonkey.me&lt;/code&gt; ，Nice....这回看到页面了。
到此我们可以在微信上用 playmonkey.me 访问本地的 dev server，可以愉快地调用 JSAPI &amp;amp; 微信 oauth 登陆 &amp;amp; 发起支付。&lt;/p&gt;

&lt;p&gt;噢，如果做的是 PC 端的 oauth 微博登录怎么办？在本地 host 加上 127.0.0.1 palymonkey.com。Nice XD、&lt;/p&gt;
&lt;h2 id="异步回调"&gt;异步回调&lt;/h2&gt;
&lt;hr&gt;

&lt;p&gt;上面说到发起支付，微信的支付结果是通过异步回调的，所以需要做内网穿透，这里推荐两个工具 &lt;code&gt;ngrok OR localtunnel&lt;/code&gt;&lt;/p&gt;
&lt;h4 id="localtunnel"&gt;localtunnel&lt;/h4&gt;
&lt;p&gt;localtunnel 是 node 写的，用起来非常简单&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ npm install -g localtunnel
$ lt --port 3000
your url is: https://gqgh.localtunnel.me
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样外网打开&lt;code&gt;https://gqgh.localtunnel.me&lt;/code&gt; 就可以访问到本地的 3000 端口&lt;/p&gt;

&lt;p&gt;但是 localtunnel 是国外的，公司网络刚刚搭好，经常不稳定果断抛弃转入 ngrok；&lt;/p&gt;
&lt;h4 id="ngrok（不想折腾的可以忽略XD）"&gt;ngrok（不想折腾的可以忽略 XD）&lt;/h4&gt;
&lt;hr&gt;

&lt;p&gt;悲催的是 ngrok 也是国外的，而且服务器给墙了，BUT，问题不大，我们可以 pull ngrok 1.X 的源码自己编译，2.0 会报证书错误如果没有合法的 https 证书。&lt;/p&gt;

&lt;p&gt;好了我们来编译 ngrok，噢，对了，ngrok 是 Go 写的，编译出来直接是一个可执行文件，爽歪歪有木有，哈~&lt;/p&gt;
&lt;h4 id="在服务器端（每家都有一只staging服务器吧）"&gt;在服务器端（每家都有一只 staging 服务器吧）&lt;/h4&gt;
&lt;hr&gt;

&lt;p&gt;NGROK_DOMAIN 设置为您自己拥有的域名，并指向 Ngrok server 运行的服务器&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NGROK_DOMAIN="my.domain.com"
git clone https://github.com/inconshreveable/ngrok.git
cd ngrok

openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000

cp rootCA.pem assets/client/tls/ngrokroot.crt
# make clean
make release-server release-client
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编译完有两个可执行文件 bin/ngrok &amp;amp; bin/ngrokd 
将 bin/ngrok copy 到你本机
在服务器上开启 ngrok server
&lt;code&gt;bin/ngrokd -tlsKey=device.key -tlsCrt=device.crt -domain="$NGROK_DOMAIN" -httpAddr=":8000" -httpsAddr=":8001"&lt;/code&gt;&lt;/p&gt;
&lt;h4 id="本地端"&gt;本地端&lt;/h4&gt;
&lt;hr&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NGROK_DOMAIN="my.domain.com"
echo -e "server_addr: $NGROK_DOMAIN:4443\ntrust_host_root_certs: false" &amp;gt; ngrok-config
./ngrok -config=ngrok-config -subdomain=playmonkey 3000 // 配置subdomain到本地3000端口，这样外网通过playmonkey.NGROK_DOMAIN 就可以访问到本地dev server的3000端口
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或者用 SSH forwarding&lt;/p&gt;

&lt;p&gt;&lt;code&gt;./ngrok -config=ngrok-config -subdomain=3000 --proto=tcp 22&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;以上 Ngrok 编译&amp;amp;配置出自 &lt;a href="https://gist.github.com/lyoshenka/002b7fbd801d0fd21f2f" rel="nofollow" target="_blank" title=""&gt;How to setup Ngrok with a self-signed SSL cert&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;至此我们在发起微信支付时回调 URL 的 HOST 就可以设置为 playmonkey.NGROK_DOMAIN&lt;/p&gt;

&lt;p&gt;&lt;em&gt;至此我们可以愉快地开发测试 微信的 oauth 登录 &amp;amp; JSAPI &amp;amp; 支付 &amp;amp; 支付回调，好吧，很多 BUG 一点都不愉快。
另外感谢 &lt;a href="/ruby_sky" class="user-mention" title="@ruby_sky"&gt;&lt;i&gt;@&lt;/i&gt;ruby_sky&lt;/a&gt; 的&lt;a href="https://ruby-china.org/topics/26138" title=""&gt;这篇微信支付文章&lt;/a&gt; 微信支付做起来如丝般顺滑；
内微信文档看起来太蛋疼了，各种配置也是找半天&lt;img title=":dizzy_face:" alt="😵" src="https://twemoji.ruby-china.com/2/svg/1f635.svg" class="twemoji"&gt;，大家有兴趣我可以总结一下微信各个开发的各种配置 XD。&lt;/em&gt;&lt;/p&gt;</description>
      <author>playmonkey</author>
      <pubDate>Sat, 11 Jul 2015 11:24:52 +0800</pubDate>
      <link>https://ruby-china.org/topics/26443</link>
      <guid>https://ruby-china.org/topics/26443</guid>
    </item>
  </channel>
</rss>
