+----------------------+-------+-------+---------+---------+-----+-------+
| Name | Lines | LOC | Classes | Methods | M/C | LOC/M |
+----------------------+-------+-------+---------+---------+-----+-------+
| Controllers | 7908 | 6380 | 121 | 745 | 6 | 6 |
| Helpers | 1380 | 1199 | 0 | 136 | 0 | 6 |
| Models | 7231 | 5465 | 68 | 567 | 8 | 7 |
| Mailers | 196 | 155 | 5 | 18 | 3 | 6 |
| Javascripts | 5781 | 4491 | 33 | 749 | 22 | 3 |
| Libraries | 1435 | 1117 | 21 | 98 | 4 | 9 |
| Feature specs | 145 | 120 | 0 | 1 | 0 | 118 |
| Model specs | 480 | 390 | 0 | 0 | 0 | 0 |
+----------------------+-------+-------+---------+---------+-----+-------+
| Total | 24556 | 19317 | 248 | 2314 | 9 | 6 |
+----------------------+-------+-------+---------+---------+-----+-------+
Code LOC: 18807 Test LOC: 510 Code to Test Ratio: 1:0.0
包含电商、SNS、API、CMS 四套大模块,也有一些遗留的孤立代码没清理,大概能删掉 2k 左右
#43 楼 @caiqinghua 也不难吧
比如你设置支付授权目录 https://knewone.com/orders/
那发起支付使用 https://knewone.com/orders/wxpay
是 ok 的
那么 route 定义
resources :orders do
collection do
get 'wxpay'
end
end
然后实现 wxpay action 就可以了,只要在这个 url 里调用微信 js 支付即可 回调因为是在参数里指定,所以用 restful 风格就是 rails 的标准实践来搞没有任何问题
AJAX 不成功恐怕要靠你自己分析了,这个自己的代码别人不好帮
另外根据我的经验,微信给的错误信息不能全信,比如你支付授权目录设置的有问题,给你的报错不靠蒙这辈子也想不通是支付授权目录设置的问题,解决方法就是,一个尽可能的多 alert 信息(微信支付只能在微信浏览器里调试,console.log 没有),一个要多注意检查配置。
gon 是个好办法,不过感觉没必要,erb 直接 render 就行了,缺点就是代码高亮有可能会乱(RubyMine 不会)
#39 楼 @caiqinghua 你发的代码 erb 本身就是可以这么用地~ 不过我是在控制器直接渲染好 json 然后这样写
WeixinJSBridge.invoke(
'getBrandWCPayRequest',
<%= raw @params %>,
function (res) {
if (res.err_msg == "get_brand_wcpay_request:ok") {
window.location.href = '<%= wxpay_callback_order_path(@order) %>';
} else if (res.err_msg == "get_brand_wcpay_request:cancel") {
window.location.href = '<%= order_path(@order) %>';
} else if (res.err_msg == "get_brand_wcpay_request:fail") {
alert('系统错误');
} else {
alert('未知错误');
}
}
);
#8 楼 @caiqinghua 另一方面,微信的 openid 获取是和系统的业务和技术耦合非常紧密的,所以没法单纯通过 Gem 层面抽象
#8 楼 @caiqinghua 因为有 omniauth-wechat-oauth2 这种更专业的 gem 解决呀
用我的 gem 吧。。。就是楼上的链接,之前刚好有朋友已经踩过 APP 支付的坑了...
如何用最少的字符翻转二叉树?请看:(╯°□°)╯︵ ǝǝɹʇ ʎɹɐuıq
@rei 似乎 hotmail 也没有收到,垃圾箱检查过了
设置一个不同的 redirect_uri 呢 这个 oauth:2.0:oob 是用来测试用的,没法用于生产环境
@luikore 求分享
#33 楼 @qicaisheng 看到了,昨天忙,我稍微重构下合并,感谢!
兹瓷!
#31 楼 @qicaisheng 辛苦~ CSRF 这个是 Rails 的防重放的机制,但是对于 API 是没有必要的,看来还是写到文档上比较好~
#29 楼 @qicaisheng 关于 APP 方面配置的情况,麻烦帮忙更新一下 wxpay 的文档吧~ 感谢!
这个问题要看下日志了,可能是你路由的配置问题,文档里我的只是为了示意 实际上我们的系统里是这样配置的路由
resources :orders do
member do
post 'wxpay_notify'
end
end
# will generate route like /orders/:id/wxpay_notify
#25 楼 @qicaisheng 理论是支持的,不过因为我目前没有环境去测试 APP 下的情况,所以避免误导没有写在文档里,如果你可以帮忙测试,通过后请告知我,更新文档、
赞!
祝你幸福!
#12 楼 @ruby_sky 其实也还好了,像 KO 这种网站会接入多家网站,对于微信来说要多存一个 UnionID,存储数据结构要考虑一下。
话说我看过 omniauth-wechat-oauth2 还有我们用的 omniauth-wechat 都没把 unionid 放到返回的结构体里,按照微信支付的文档来看应当会随着返回的。 另外这两个 Gem(后者我贡献过代码解决了)不支持动态定制 scope(scope 在配置写死或者根据传入 URL 参数)还有 state 参数(这个做返回后的页面跳转很有帮助)
当然啦,是不是坑还是结合业务来看的。 首先,定制 scope 在一些场景下很有必要,比如,微信浏览器里的分享到___API,是需要 access_token 的,但此时如果 scope 为 snsapi_userinfo,那么就会弹出授权框,影响用户体验。但是用户注册的时候,还是希望告知用户授权并且这样也可以拿到更全面的用户信息,这时候就需要 snsapi_userinfo 了。
另外,要为微信设计特别的授权流程(如果多网站接入的话),前边说了,从微信处授权有两种目的:1.方便调用分享 API 2.用户注册 要为这两种情况设计不同的行为和交互,而其他网站的接入回调的业务逻辑通常是统一的,这就引入了额外的开发成本。
话说 LZ 可以考虑再深入一步,讲讲开放平台 unionid 的问题,这个估计是对接微信时最大的坑
#20 楼 @jicheng1014 笑来老师是投资人啦