Gem 集成支付宝付款求助

rubyonme · August 29, 2012 · Last by Cofyc replied at May 28, 2013 · 5295 hits

使用 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)
                     )

有人知道是怎么回事吗?

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

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

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

@huacnlee 那段 js 我也加了

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

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

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

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

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

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

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

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

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

这个问题我解决了。

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'

You need to Sign in before reply, if you don't have an account, please Sign up first.