Gem 集成支付宝付款求助

rubyonme · 发布于 2012年08月29日 · 最后由 Cofyc 回复于 2013年05月28日 · 3503 次阅读
1273

使用 ruby 1.9.3 rails 3.2.8 根据 activemerchant_patch_for_china 的示例代码

<% service.total_fee @amount %>
  <% service.seller :email => @config.ali_seller_email %>
  <% service.notify_url url_for(:only_path => false, :action => 'pay_notify') %>
  <% service.return_url url_for(:only_path => false, :action => 'pay_done') %>
  <% service.show_url url_for(:only_path => false, :action => 'show_search') %>
  <% service.body '测试中文' %>
  <% service.charset "utf-8" %>
  <% service.service ActiveMerchant::Billing::Integrations::Alipay::Helper::CREATE_DIRECT_PAY_BY_USER %>
  <% service.payment_type 1 %>
  <% service.paymethod 'bankPay'%>
  <% service.subject 'test' %>
  <% service.sign %>

<% service.body '测试中文' %> 这句如果换成英文是没有问题的,如果是中文支付宝会返回 错误代码 ILLEGAL_SIGN。 大概的研究了一下是因为<% service.sign %>这个签名的生成的不对。 看了下 activemerchant_patch_for_china 的源代码,问题出在这句

add_field('sign',
                      Digest::MD5.hexdigest((@fields.sort.collect{|s|s[0]+"="+CGI.unescape(s[1])}).join("&")+KEY)
                     )

有人知道是怎么回事吗?

共收到 15 条回复
7284d6

# 一定要先unescape后再生成sign,否则支付宝会报ILLEGAL SIGN 看看这篇文章 http://dohkoos.name/rails-applications-integrated-in-the-payment-of-po.html

1273

@andrew_zyl 源码里面已经调用 unescape 了,我以前在rails2.3里面用过,没出现这个问题,奇怪了。

De6df3

注意 WIKI 里面有段关于 Rails 3 需要用 JS 处理的说明

1273

@huacnlee 那段js我也加了

De6df3

#5楼 @rubyonme Gem 是没问题的,我最近刚用它实现过一个支付功能

1273

@huacnlee 我也感觉奇怪啊,那段js应该是把rails3自动生成的表单隐藏域去掉了。但是我测试英文没有问题,中文就出错 。应该还是 <% service.sign %> 的问题,可是看源码里已经 unescape 了,搞不懂了。。。

522

#7楼 @rubyonme 楼主问题解决了没呢?我也遇到同样的问题。

1273

@richfisher 没呢,后来就没研究怎么回事,都换成英文了。

3094

rails3.0 没遇到过上述问题 中文正常

580

我们用的Padrino框架,使用的也是 activemerchant_patch_for_china 。在不同的电脑上测试,都使用IE9浏览器付款,有的会报ILLEGAL_SIGN,有的能正常付款。 正在查找原因

580

我的解决方法:不要让浏览器解析URL中的 汉字。 在传递URL给浏览器之前,用Ruby的URI.escape方法,或者JavaScript的encodeURI函数,将URL中的汉字先进行编码,再传递给浏览器。 参考:http://www.ruanyifeng.com/blog/2010/02/url_encoding.html

445

@rubyonme @helloqidi 这个问题最后如何解决?有详细的解决办法吗?

580

@stephen 我遇到的报错“ILLEGAL_SIGN”,是通过“不要让浏览器解析URL中的 汉字”的方法解决的,具体的就是我上一次回帖中写的。

96

这个问题我解决了。

payment_service_for 生成的 form 的 method 必须为 GET(参考官方 php sdk)

我的修改:https://github.com/flyerhzm/activemerchant_patch_for_china/pull/15

目前可以使用我 fork 的 activemerchant_patch_for_china 版本:

gem "activemerchant_patch_for_china", github: 'Cofyc/activemerchant_patch_for_china'

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