使用 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)
)
有人知道是怎么回事吗?