Module: NewAlipay::BatchTrans

Defined in:
lib/new_alipay/batch_trans.rb

Constant Summary collapse

ALIPAY_GATEWAY_NEW =

支付宝网关地址(新)

'https://mapi.alipay.com/gateway.do?'
HTTPS_VERIFY_URL =

HTTPS形式消息验证地址

'https://mapi.alipay.com/gateway.do?service=notify_verify&'
HTTP_VERIFY_URL =

HTTP形式消息验证地址

'http://notify.alipay.com/trade/notify_query.do?'

Class Method Summary collapse

Class Method Details

.random_trade_no(length = 26) ⇒ Object

返回随机交易密码



16
17
18
# File 'lib/new_alipay/batch_trans.rb', line 16

def random_trade_no(length=26)
  Time.new.strftime('%Y%m%d')+(length-8).times.inject('') { |acc, i| acc+=('0'..'9').to_a[(i+Random.rand(1000))%10]; acc }
end

.resubmit(para_temp) {|parameters.symbolize_keys.merge({:sign => sign, :sign_type => 'MD5'})| ... } ⇒ Object

Yields:

  • (parameters.symbolize_keys.merge({:sign => sign, :sign_type => 'MD5'}))


50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/new_alipay/batch_trans.rb', line 50

def resubmit(para_temp)
  parameters = {
      "service" => "batch_trans_notify",
      "partner" => NewAlipay.partner,
      "notify_url" => para_temp[:notify_url],
      "email" => NewAlipay.seller_email,
      "account_name" => NewAlipay.,
      "pay_date" => para_temp[:pay_date],
      "batch_no" => para_temp[:batch_no],
      "batch_fee" => para_temp[:batch_fee],
      "batch_num" => para_temp[:batch_num],
      "detail_data" => para_temp[:detail_data],
      "_input_charset" => "utf-8"
  }
  parameters = parameters.merge({buyer_account_name: para_temp[:buyer_account_name]}) if para_temp[:buyer_account_name]
  signing_str_array = parameters.inject([]) { |memo, (key, v)| memo << "#{key}=#{v}"; memo }
  sorted_signing_str_array = signing_str_array.sort! { |m, n| m.to_s <=> n.to_s }
  sign = Digest::MD5.hexdigest(sorted_signing_str_array.join('&')+NewAlipay.key)

  sorted_signing_str_array << "sign=#{sign}" << 'sign_type=MD5'

  yield parameters.symbolize_keys.merge({:sign => sign, :sign_type => 'MD5'}) if block_given?

  "#{ALIPAY_GATEWAY_NEW}#{sorted_signing_str_array.join('&')}"
end

.submit(para_temp) {|parameters.symbolize_keys.merge({:sign => sign, :sign_type => 'MD5'})| ... } ⇒ Object

建立请求,以表单HTML形式构造(默认)

Parameters:

  • para_temp

    请求参数数组

Yields:

  • (parameters.symbolize_keys.merge({:sign => sign, :sign_type => 'MD5'}))

Returns:

  • 提交表单HTML文本



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/new_alipay/batch_trans.rb', line 23

def submit(para_temp)
  parameters = {
      "service" => "batch_trans_notify",
      "partner" => NewAlipay.partner,
      "notify_url" => para_temp[:notify_url],
      "email" => NewAlipay.seller_email,
      "account_name" => NewAlipay.,
      "pay_date" => Time.new.strftime('%Y-%m-%d'),
      "batch_no" => random_trade_no(24),
      "batch_fee" => para_temp[:batch_fee],
      "batch_num" => para_temp[:batch_num],
      "detail_data" => para_temp[:detail_data],
      "_input_charset" => "utf-8"
  }
  parameters = parameters.merge({buyer_account_name: para_temp[:buyer_account_name]}) if para_temp[:buyer_account_name]

  signing_str_array = parameters.inject([]) { |memo, (key, v)| memo << "#{key}=#{v}"; memo }
  sorted_signing_str_array = signing_str_array.sort! { |m, n| m.to_s <=> n.to_s }
  sign = Digest::MD5.hexdigest(sorted_signing_str_array.join('&')+NewAlipay.key)

  sorted_signing_str_array << "sign=#{sign}" << 'sign_type=MD5'

  yield parameters.symbolize_keys.merge({:sign => sign, :sign_type => 'MD5'}) if block_given?

  "#{ALIPAY_GATEWAY_NEW}#{sorted_signing_str_array.join('&')}"
end

.verify_notify?(post_params) ⇒ Boolean

params.except(*request.env.keys.push(:route_info))

Parameters:

  • post_params

    除去系统变量的参数

Returns:

  • (Boolean)


78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/new_alipay/batch_trans.rb', line 78

def verify_notify?(post_params)
  post_sign = post_params[:sign]
  verifing_sign = Digest::MD5.hexdigest(post_params.reject { |p| [:sign, :sign_type].include?(p) }
                                            .inject([]) { |memo, (key, v)| memo << "#{key}=#{v}"; memo }
                                            .sort! { |m, n| m.to_s <=> n.to_s }.join('&')+NewAlipay.key)

  puts "#{verifing_sign}:#{post_sign}"
  unless verifing_sign == post_sign
    return false
  end

  begin
    conn = Faraday.new(:url => 'https://mapi.alipay.com') do |faraday|
      faraday.request :url_encoded # form-encode POST params
      faraday.response :logger # log requests to STDOUT
      faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
    end
    response = conn.get '/gateway.do', {:service => 'notify_verify', partner: NewAlipay.partner, notify_id: post_params[:notify_id]}
    response.body.to_s == 'true'
  rescue Exception => e
    false
  end
end