Rails [微信开发] 开发环境搭建

playmonkey · 2015年07月11日 · 最后由 xtunnel 回复于 2015年12月27日 · 18142 次阅读
本帖已被管理员设置为精华贴

由于微信开发都是在微信内浏览器运行,不管是登陆还是支付都不能在 PC 开发端愉快地玩耍,但世界我们还是需要拯救的。

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

一般的第三方开发永远离不开两个配置,域名 & 回调,有一些平台支持 localhost 的域名&回调会方便,更有支持随意更改端口的,微信上面貌似都没有 💢

好了,假定我们的域名是 playmonkey.me

域名


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

干这个勾当的当属 Charles 神器。

  • 下载安装打开 Charles
  • Proxy -> Proxy Setting -> Http Proxy勾选 Enable.... 开启 http proxy 代理,端口默认是 8888
  • Tool -> DNS Spoofing Settings 勾选 Enable DNS Spoofing
  • 然后把 palymonkey.me 加到 DNS Spoofs,指向本机 127.0.0.1

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

访问http://playmonkey.me

什么?挂了?当然,酱紫访问的是本地的 80 端口。

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

首先安装启动 Nginx,用 Apache 的朋友对不起了,你们要自食其力 XD

配置 Nginx

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

再用手机访问http://playmonkey.me ,Nice....这回看到页面了。 到此我们可以在微信上用 playmonkey.me 访问本地的 dev server,可以愉快地调用 JSAPI & 微信 oauth 登陆 & 发起支付。

噢,如果做的是 PC 端的 oauth 微博登录怎么办?在本地 host 加上 127.0.0.1 palymonkey.com。Nice XD、

异步回调


上面说到发起支付,微信的支付结果是通过异步回调的,所以需要做内网穿透,这里推荐两个工具 ngrok OR localtunnel

localtunnel

localtunnel 是 node 写的,用起来非常简单

$ npm install -g localtunnel
$ lt --port 3000
your url is: https://gqgh.localtunnel.me

这样外网打开https://gqgh.localtunnel.me 就可以访问到本地的 3000 端口

但是 localtunnel 是国外的,公司网络刚刚搭好,经常不稳定果断抛弃转入 ngrok;

ngrok(不想折腾的可以忽略 XD)


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

好了我们来编译 ngrok,噢,对了,ngrok 是 Go 写的,编译出来直接是一个可执行文件,爽歪歪有木有,哈~

在服务器端(每家都有一只 staging 服务器吧)


NGROK_DOMAIN 设置为您自己拥有的域名,并指向 Ngrok server 运行的服务器

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

编译完有两个可执行文件 bin/ngrok & bin/ngrokd 将 bin/ngrok copy 到你本机 在服务器上开启 ngrok server bin/ngrokd -tlsKey=device.key -tlsCrt=device.crt -domain="$NGROK_DOMAIN" -httpAddr=":8000" -httpsAddr=":8001"

本地端


NGROK_DOMAIN="my.domain.com"
echo -e "server_addr: $NGROK_DOMAIN:4443\ntrust_host_root_certs: false" > ngrok-config
./ngrok -config=ngrok-config -subdomain=playmonkey 3000 // 配置subdomain到本地3000端口,这样外网通过playmonkey.NGROK_DOMAIN 就可以访问到本地dev server的3000端口

或者用 SSH forwarding

./ngrok -config=ngrok-config -subdomain=3000 --proto=tcp 22

以上 Ngrok 编译&配置出自 How to setup Ngrok with a self-signed SSL cert

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

至此我们可以愉快地开发测试 微信的 oauth 登录 & JSAPI & 支付 & 支付回调,好吧,很多 BUG 一点都不愉快。 另外感谢 @ruby_sky这篇微信支付文章 微信支付做起来如丝般顺滑; 内微信文档看起来太蛋疼了,各种配置也是找半天😵,大家有兴趣我可以总结一下微信各个开发的各种配置 XD。

Thanks,文章写得不错。

似乎图片挂了?麻烦你调整一下吧。

#1 楼 @ruby_sky 😄 谢谢,欢迎交流拍砖

#2 楼 @pengedy 看来不让外链....,就两张 charles 的配置图 XD

#4 楼 @PlayMonkey 总之是不错的文章,学习了。

非常感谢,说的很细致了!

感谢。我先 mark 以下

还是挺利索的。

支付推荐 ping++

#11 楼 @ryan 也在用,简单方便。

#11 楼 @ryan ping++ 确实好用,一些原因没用,哎~

#13 楼 @PlayMonkey 有机会最好迁移啦,关键支付途径他已经支持很多了,尤其对电商网站有用

#异步回调# 这部分还是值得参考学习的,支付什么的都会有涉及,需要公网 IP,要么就是公网 IP 机器映射到本地,不过还是文章写的这种方式更优雅。

#移动设备绑定本地域名# 也实用。

感谢分享

mark 一下

可以考虑搞个 hiwifi 活着 huawei 路由器,PAT,花生壳什么的都直接搞定了。

赞 Mark 一个

Mark 瞬间觉得以前的方法好 low

如果用 Ngrok 1.x 可以用 http://www.tunnel.mobi/ 可以解决墙的问题。

#20 楼 @allenfantasy tunnel.mobi 是国内某位仁兄搭的 ngrok 搭的服务器,因为我们有很多交易数据所以自己搭建了 XD

#2 楼 @pengedy pengpeng 的梦想是什么

#22 楼 @zzz6519003 歪楼啊... 我的梦想是找个妹子一起骑马走天下

已被微信强奸

我的经验是使用二级域名。。

给 ngrok 的作者写邮件说明了 US 节点被墙了,他回复说会在新加坡节点再搭个服务,期待下。

不过自己搭有个好处就是如果你的域名是备案的,那 js-sdk 也能在本机调了

#26 楼 @goofansu ngrok 只是在异步回调会用到,本机调用 js-sdk 用 Charles 做代理搞定域名,在本机就可以调了

微信居然没有开发接口。。。

#28 楼 @pynix 支付宝也是一分钱测试 😢

#27 楼 @playmonkey 谢谢指出。我是想在开发的时候让别人也能访问微信服务号的功能,用 Charles 的话还要让别人改代理,增加了些使用成本。自己开发的话用 Charles 是可以的。

另外请教下,现在是不是只有微信支付才会要处理异步回调?我的服务号是公司的,还没开通支付功能,不知道实际是什么样子的。谢谢

#30 楼 @goofansu 对的,只有支付会有异步回调,当然也有主动查询支付结果的 API 可以用 XD

这篇文章非常有用!

微信企业号的回调模式:企业号里面的应用交互首先是应用把消息推送给微信的服务器。然后触发回调请求。感觉上是必须要经过微信的服务器。不知道我说错了没有

感谢楼主~非常有用~

xtunnel 开源内网穿透,图形界面,功能更强大 https://github.com/d1sm/xtunnel

需要 登录 后方可回复, 如果你还没有账号请 注册新账号