alipay-easysdk-ruby 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: alipay-easysdk-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alipay EasySDK Team
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-10-27 00:00:00.000000000 Z
11
+ date: 2025-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -73,19 +73,24 @@ executables: []
73
73
  extensions: []
74
74
  extra_rdoc_files: []
75
75
  files:
76
+ - CHANGELOG.md
76
77
  - README.md
77
78
  - Rakefile
78
- - examples/demo.rb
79
- - examples/demo_with_post.rb
80
79
  - lib/alipay/easysdk.rb
81
80
  - lib/alipay/easysdk/kernel/alipay_constants.rb
81
+ - lib/alipay/easysdk/kernel/cert_environment.rb
82
82
  - lib/alipay/easysdk/kernel/config.rb
83
83
  - lib/alipay/easysdk/kernel/easy_sdk_kernel.rb
84
84
  - lib/alipay/easysdk/kernel/factory.rb
85
+ - lib/alipay/easysdk/kernel/util/aes.rb
86
+ - lib/alipay/easysdk/kernel/util/ant_certification_util.rb
85
87
  - lib/alipay/easysdk/kernel/util/json_util.rb
88
+ - lib/alipay/easysdk/kernel/util/page_util.rb
86
89
  - lib/alipay/easysdk/kernel/util/response_checker.rb
87
90
  - lib/alipay/easysdk/kernel/util/sign_content_extractor.rb
88
91
  - lib/alipay/easysdk/kernel/util/signer.rb
92
+ - lib/alipay/easysdk/payment/app/client.rb
93
+ - lib/alipay/easysdk/payment/app/models/alipay_trade_app_pay_response.rb
89
94
  - lib/alipay/easysdk/payment/common/client.rb
90
95
  - lib/alipay/easysdk/payment/common/models/alipay_data_dataservice_bill_downloadurl_query_response.rb
91
96
  - lib/alipay/easysdk/payment/common/models/alipay_trade_cancel_response.rb
data/examples/demo.rb DELETED
@@ -1,133 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'alipay/easysdk'
4
- require 'net/http'
5
- require 'uri'
6
- require 'cgi'
7
- require 'openssl'
8
-
9
- # ------------------ 辅助方法(完全对应 PHP 版逻辑) ------------------
10
-
11
- def get_options
12
- Alipay::EasySDK::Kernel::Config.new(
13
- protocol: 'https',
14
- gateway_host: 'openapi-sandbox.dl.alipaydev.com',
15
- sign_type: 'RSA2',
16
- app_id: '9021000156667919',
17
- merchant_private_key: 'MIIEogIBAAKCAQEAmy8gfxY5RFBKixIWoflLqULF1gZ43QdlEYln+1f0k+tbiWbhi3DBOKp9gjgGmOJmBzVuaDQ+VMDmrolIc8tOz6urQU2PSjMSSqLub3xwyxiZO2qjfkn5riO68ITkr3RN7zVyZcheoaTfexygtg7xH8eqbqhghnVs97KwKnkIt7mzhIvbs60qrV8YAkbm6Hw85s4BVBoBleFZPQCBDXffVTz72GGu5iFHcbVoZdtT2GKPWWiaYb9BEuzzmUo41pPdHrMYP0VnR9UdGnLZyC70YXQ6ZshRux0/rkIrxLGVlk5UBTqdxtP8r2oqoVLl4L5tBcTw4gRPqL4+UiDQ7YE3ZQIDAQABAoIBAHhcqhjIFOy+VcLd6b4BjMSgbK+e33mXtbVPXN4ejy13e8zrhf5QGx2nZqdsavmDh90JfTPHaZz07TbsdcySIPOD09VXoc7MI+DN1J+V5iowTxE9mcdm+wgs4F6SxIitbZEeZDc7nOJE7a0gPCpZFn4usCsZ35wKUdUgu/CFZdSRNdSKBdwdDQcMA/rClHqDvIeCBAbK979cr4/ltAofBQTt9YhZsXpChSQZOnyYFRBPtlblthPcJQOhN6ZH7EsNftdh+elHNjNaH+a6fcCiS4J9yhEtqeQs0ZGDSsE3b7zHW+cOaicvE4X9U651ipVxkYXRK1WhfctRF/cjzqsVtNUCgYEA30NT2kk3CLc8/gXEm/oitEkLx3gp+eH5gLrAE41fcTUloeg+bHXPqQh0IFyLTNUIJ4RF/HdlqHFciKVDUN5HVZeG/RAB3BgTpQV174LuebRs6Fuj3T/qvaV9GdKsTMwnZpljsTJJFiQNMW/vczmy+HbPeMO4r1TWk8GgaD4580MCgYEAsfBObh5dC9D9hIkPIaxZFdAIhmWN8MF3WbEg0LI3YzjW9b6Qd6rn9IyB2UtM4u+lseiLe5XMrR1nzwgxyELyr/w2Mov2F9Zf/DhUqPv/qpegu7xD6U8ca4fJMYfN3sT9R2M3P074U15MlPjBEojtSwg/4oBEcono43+lcRiI/DcCgYAHp6BNYKtBYj72Gq6GBoqAEe0UdrtBtQy/7Cc/xF4cXI0gwvy47UUkb4TDw0iHZtpzuGZJ5LIYl2Jr0PbA5A4gEiTvskfOCwlJZCmJ/7w7cgM16EZzBIkA3ZavdvivXWSQcPvpDGdTGgNVyZe1JKpNOI2ef19qq4b74+yjBlcoTwKBgA/vUkbAR1rgi2OMFqPQWGYArFLE03JFERgiKasm2pjzJST6vNtKnd0jnBlGigskpPUKuzsFDkBOitZaiILDpBIohv391LsLwqrGrKY5cwrm60kEshw5rnTewyDBZalWgMwc0XzE6K4mmrsYj8nGI2H9yiLRk8+iFA4Th1BafyH/AoGAcQHDXuNR0inKvsoEX1hYAoYmE7GwYcxl88AdrAnfqJHgdxHaWCKb/gYiXqRR0RFhiAEZCuVm9IvJ6Dh2eR2psC9lyixgQiyiJYLSA1sLzVzQS/OkSpC3w5srcwxOWzRTBreZbGzV+zJqh9NBCQt0S3Bq2Mi1qYxzxUAytlYSdrQ=',
18
- alipay_public_key: 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmy8gfxY5RFBKixIWoflLqULF1gZ43QdlEYln+1f0k+tbiWbhi3DBOKp9gjgGmOJmBzVuaDQ+VMDmrolIc8tOz6urQU2PSjMSSqLub3xwyxiZO2qjfkn5riO68ITkr3RN7zVyZcheoaTfexygtg7xH8eqbqhghnVs97KwKnkIt7mzhIvbs60qrV8YAkbm6Hw85s4BVBoBleFZPQCBDXffVTz72GGu5iFHcbVoZdtT2GKPWWiaYb9BEuzzmUo41pPdHrMYP0VnR9UdGnLZyC70YXQ6ZshRux0/rkIrxLGVlk5UBTqdxtP8r2oqoVLl4L5tBcTw4gRPqL4+UiDQ7YE3ZQIDAQAB',
19
- encrypt_key: 'rEoolKE9DfJIQHMMelZapw=='
20
- )
21
- end
22
-
23
- def extract_action_url(form_html)
24
- match = form_html.match(/action=['"](.*?)['"]/)
25
- return nil unless match
26
-
27
- url = match[1]
28
- begin
29
- parsed_uri = URI.parse(url)
30
- "#{parsed_uri.scheme}://#{parsed_uri.host}#{parsed_uri.path}"
31
- rescue URI::InvalidURIError
32
- url
33
- end
34
- end
35
-
36
- def extract_all_form_params(form_html)
37
- params = {}
38
- form_html.scan(/<input[^>]*name=['"](.*?)['"][^>]*value=['"](.*?)['"][^>]*>/i) do |name, value|
39
- params[name] = CGI.unescapeHTML(value)
40
- end
41
- params
42
- end
43
-
44
- def send_post_request(url_string, params)
45
- uri = URI.parse(url_string)
46
- http = Net::HTTP.new(uri.host, uri.port)
47
- http.use_ssl = uri.scheme == 'https'
48
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE if uri.scheme == 'https'
49
-
50
- post_data = params.map { |key, value| "#{CGI.escape(key)}=#{CGI.escape(value)}" }.join('&')
51
-
52
- puts "发送POST请求到: #{url_string}"
53
- puts "POST数据: #{post_data}"
54
-
55
- headers = {
56
- 'Content-Type' => 'application/x-www-form-urlencoded; charset=UTF-8',
57
- 'Accept' => '*/*',
58
- 'Accept-Charset' => 'UTF-8',
59
- 'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
60
- }
61
-
62
- request = Net::HTTP::Post.new(uri.request_uri, headers)
63
- request.body = post_data
64
-
65
- response = http.start { |client| client.request(request) }
66
-
67
- if response.code.to_i >= 300 && response.code.to_i < 400
68
- location = response['location']
69
- if location
70
- puts "检测到重定向到: #{location}"
71
- return send_post_request(location, params)
72
- end
73
- end
74
-
75
- puts "HTTP响应码: #{response.code}"
76
- puts "响应长度: #{response.body.length} 字节"
77
-
78
- unless response.code.to_i == 200
79
- puts "响应内容预览: #{response.body[0, 500]}..."
80
- raise "HTTP请求失败,响应码: #{response.code}"
81
- end
82
-
83
- response.body
84
- end
85
-
86
- def save_response_to_file(content, filename)
87
- File.write(filename, content)
88
- end
89
-
90
- # ------------------ 主流程 ------------------
91
-
92
- begin
93
- Alipay::EasySDK::Kernel::Factory.set_options(get_options)
94
-
95
- response = Alipay::EasySDK::Kernel::Factory.payment
96
- .wap
97
- .pay(
98
- '1123',
99
- '70501111111S001111119',
100
- '9.00',
101
- 'https://your-quit-url.com',
102
- 'https://your-return-url.com'
103
- )
104
-
105
- response_checker = Alipay::EasySDK::Kernel::Util::ResponseChecker.new
106
-
107
- if response_checker.success(response)
108
- puts '调用成功'
109
- puts "支付表单HTML: #{response.body}"
110
-
111
- form_html = response.body
112
- action_url = extract_action_url(form_html)
113
- all_params = extract_all_form_params(form_html)
114
-
115
- puts "Action URL: #{action_url}"
116
- puts "表单参数数量: #{all_params.size}"
117
- all_params.each do |key, value|
118
- puts " #{key}: #{value}"
119
- end
120
-
121
- if action_url && !all_params.empty?
122
- post_response = send_post_request(action_url, all_params)
123
- save_response_to_file(post_response, 'alipay_ruby_response.txt')
124
- puts '响应已保存到 alipay_ruby_response.txt'
125
- end
126
- else
127
- puts "调用失败,原因:#{response.error_message}"
128
- end
129
- rescue => e
130
- puts "调用遭遇异常,原因:#{e.message}"
131
- puts e.backtrace.join("\n") if ENV['DEBUG']
132
- raise e
133
- end
@@ -1,239 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'alipay/easysdk'
4
- require 'net/http'
5
- require 'uri'
6
- require 'json'
7
- require 'cgi'
8
-
9
- # 如果没有nokogiri,使用简单的正则表达式解析
10
- begin
11
- require 'nokogiri'
12
- rescue LoadError
13
- # Nokogiri not available, will use regex fallback
14
- end
15
-
16
- # 从HTML表单中提取action URL - 按照PHP版本逻辑
17
- def extract_action_url(form_html)
18
- # 使用正则表达式提取action URL
19
- if match = form_html.match(/action=['"](.*?)['"]/)
20
- url = match[1]
21
- # 移除URL中的查询参数,因为不应该在URL中包含参数
22
- begin
23
- parsed_uri = URI.parse(url)
24
- "#{parsed_uri.scheme}://#{parsed_uri.host}#{parsed_uri.path}"
25
- rescue
26
- url
27
- end
28
- end
29
- end
30
-
31
- # 从HTML表单中提取所有input参数 - 按照PHP版本逻辑
32
- def extract_all_form_params(form_html)
33
- params = {}
34
-
35
- # 尝试使用Nokogiri
36
- begin
37
- doc = Nokogiri::HTML(form_html)
38
- doc.css('input').each do |input|
39
- name = input['name']
40
- value = input['value']
41
-
42
- if name && !name.empty?
43
- # HTML解码
44
- decoded_value = CGI.unescapeHTML(value)
45
- params[name] = decoded_value
46
- end
47
- end
48
- rescue
49
- # Nokogiri不可用时,使用正则表达式
50
- form_html.scan(/<input[^>]*name=['"](.*?)['"][^>]*value=['"](.*?)['"][^>]*>/) do |match|
51
- name = match[0]
52
- value = match[1]
53
- if name && !name.empty?
54
- decoded_value = CGI.unescapeHTML(value)
55
- params[name] = decoded_value
56
- end
57
- end
58
- end
59
-
60
- params
61
- end
62
-
63
- # 从action URL中提取查询参数 - Ruby版本特有
64
- def extract_url_params(action_url_with_params)
65
- params = {}
66
-
67
- begin
68
- parsed_uri = URI.parse(action_url_with_params)
69
- if parsed_uri.query
70
- # 解析查询参数
71
- query_params = CGI.parse(parsed_uri.query)
72
- query_params.each do |key, values|
73
- # CGI.parse返回数组,我们取第一个值
74
- params[key] = values[0] unless values.empty?
75
- end
76
- end
77
- rescue => e
78
- puts "解析URL参数时出错: #{e.message}"
79
- end
80
-
81
- params
82
- end
83
-
84
- # 发送POST请求 - 按照PHP版本逻辑
85
- def send_post_request(url_string, params)
86
- puts "调试:发送POST请求到URL = #{url_string}"
87
- uri = URI.parse(url_string)
88
- puts "调试:URI解析结果 scheme=#{uri.scheme}, host=#{uri.host}, port=#{uri.port}"
89
- http = Net::HTTP.new(uri.host, uri.port)
90
-
91
- # 正确处理HTTPS
92
- if uri.scheme == 'https'
93
- puts "调试:启用HTTPS"
94
- http.use_ssl = true
95
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
96
- else
97
- puts "调试:使用HTTP(scheme=#{uri.scheme})"
98
- end
99
-
100
- # 构建POST数据,包含所有参数(包括sign) - 按字母顺序排列(与签名生成时一致)
101
- # 注意:sign参数需要包含在POST请求中,但不参与签名排序
102
- post_params = params.dup
103
- sign_value = post_params.delete('sign') # 临时移除sign参数
104
-
105
- # 对其他参数按字母排序
106
- sorted_params = Hash[post_params.sort_by { |key, _| key }]
107
-
108
- # 构建POST数据(先排序的参数,最后加上sign)
109
- post_data_parts = sorted_params.map { |key, value|
110
- "#{URI.encode_www_form_component(key)}=#{URI.encode_www_form_component(value)}"
111
- }
112
-
113
- # 如果有sign参数,添加到最后
114
- if sign_value
115
- post_data_parts << "#{URI.encode_www_form_component('sign')}=#{URI.encode_www_form_component(sign_value)}"
116
- end
117
-
118
- post_data = post_data_parts.join('&')
119
-
120
- headers = {
121
- 'Content-Type' => 'application/x-www-form-urlencoded; charset=UTF-8',
122
- 'Accept' => '*/*',
123
- 'Accept-Charset' => 'UTF-8',
124
- 'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
125
- }
126
-
127
- puts "发送POST请求到: #{url_string}"
128
- puts "POST数据: #{post_data}"
129
-
130
- request = Net::HTTP::Post.new(uri.request_uri, headers)
131
- request.body = post_data
132
-
133
- # 跟随重定向(按照PHP版本的curl设置)
134
- http.use_ssl = true if uri.scheme == 'https'
135
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE if uri.scheme == 'https'
136
-
137
- # 启用自动重定向跟随
138
- http.start do |http|
139
- response = http.request(request)
140
-
141
- puts "HTTP响应码: #{response.code}"
142
- puts "响应长度: #{response.body.length} 字节"
143
-
144
- # 检查重定向并跟随(类似PHP版本的CURLOPT_FOLLOWLOCATION)
145
- if response.code.to_i >= 300 && response.code.to_i < 400
146
- location = response['location']
147
- if location
148
- puts "检测到重定向到: #{location}"
149
- # 如果是重定向,递归调用
150
- return send_post_request(location, params)
151
- end
152
- end
153
-
154
- if response.code.to_i != 200
155
- puts "HTTP响应头信息:"
156
- response.each_header do |key, value|
157
- if key.start_with?('http') || key.downcase == 'location'
158
- puts " #{key}: #{value}"
159
- end
160
- end
161
- puts "响应内容预览:"
162
- puts response.body[0, 500] + "..." if response.body.length > 500
163
- raise "HTTP请求失败,响应码: #{response.code}"
164
- end
165
-
166
- return response.body
167
- end
168
- end
169
-
170
- # 将响应保存到文件
171
- def save_response_to_file(content, filename)
172
- File.write(filename, content)
173
- end
174
-
175
- begin
176
- # 1. 设置配置(全局只需设置一次)- 使用与PHP版本完全相同的配置
177
- Alipay::EasySDK.configure(
178
- protocol: 'https',
179
- gateway_host: 'openapi-sandbox.dl.alipaydev.com',
180
- sign_type: 'RSA2',
181
- app_id: '9021000156667919',
182
- merchant_private_key: 'MIIEogIBAAKCAQEAmy8gfxY5RFBKixIWoflLqULF1gZ43QdlEYln+1f0k+tbiWbhi3DBOKp9gjgGmOJmBzVuaDQ+VMDmrolIc8tOz6urQU2PSjMSSqLub3xwyxiZO2qjfkn5riO68ITkr3RN7zVyZcheoaTfexygtg7xH8eqbqhghnVs97KwKnkIt7mzhIvbs60qrV8YAkbm6Hw85s4BVBoBleFZPQCBDXffVTz72GGu5iFHcbVoZdtT2GKPWWiaYb9BEuzzmUo41pPdHrMYP0VnR9UdGnLZyC70YXQ6ZshRux0/rkIrxLGVlk5UBTqdxtP8r2oqoVLl4L5tBcTw4gRPqL4+UiDQ7YE3ZQIDAQABAoIBAHhcqhjIFOy+VcLd6b4BjMSgbK+e33mXtbVPXN4ejy13e8zrhf5QGx2nZqdsavmDh90JfTPHaZz07TbsdcySIPOD09VXoc7MI+DN1J+V5iowTxE9mcdm+wgs4F6SxIitbZEeZDc7nOJE7a0gPCpZFn4usCsZ35wKUdUgu/CFZdSRNdSKBdwdDQcMA/rClHqDvIeCBAbK979cr4/ltAofBQTt9YhZsXpChSQZOnyYFRBPtlblthPcJQOhN6ZH7EsNftdh+elHNjNaH+a6fcCiS4J9yhEtqeQs0ZGDSsE3b7zHW+cOaicvE4X9U651ipVxkYXRK1WhfctRF/cjzqsVtNUCgYEA30NT2kk3CLc8/gXEm/oitEkLx3gp+eH5gLrAE41fcTUloeg+bHXPqQh0IFyLTNUIJ4RF/HdlqHFciKVDUN5HVZeG/RAB3BgTpQV174LuebRs6Fuj3T/qvaV9GdKsTMwnZpljsTJJFiQNMW/vczmy+HbPeMO4r1TWk8GgaD4580MCgYEAsfBObh5dC9D9hIkPIaxZFdAIhmWN8MF3WbEg0LI3YzjW9b6Qd6rn9IyB2UtM4u+lseiLe5XMrR1nzwgxyELyr/w2Mov2F9Zf/DhUqPv/qpegu7xD6U8ca4fJMYfN3sT9R2M3P074U15MlPjBEojtSwg/4oBEcono43+lcRiI/DcCgYAHp6BNYKtBYj72Gq6GBoqAEe0UdrtBtQy/7Cc/xF4cXI0gwvy47UUkb4TDw0iHZtpzuGZJ5LIYl2Jr0PbA5A4gEiTvskfOCwlJZCmJ/7w7cgM16EZzBIkA3ZavdvivXWSQcPvpDGdTGgNVyZe1JKpNOI2ef19qq4b74+yjBlcoTwKBgA/vUkbAR1rgi2OMFqPQWGYArFLE03JFERgiKasm2pjzJST6vNtKnd0jnBlGigskpPUKuzsFDkBOitZaiILDpBIohv391LsLwqrGrKY5cwrm60kEshw5rnTewyDBZalWgMwc0XzE6K4mmrsYj8nGI2H9yiLRk8+iFA4Th1BafyH/AoGAcQHDXuNR0inKvsoEX1hYAoYmE7GwYcxl88AdrAnfqJHgdxHaWCKb/gYiXqRR0RFhiAEZCuVm9IvJ6Dh2eR2psC9lyixgQiyiJYLSA1sLzVzQS/OkSpC3w5srcwxOWzRTBreZbGzV+zJqh9NBCQt0S3Bq2Mi1qYxzxUAytlYSdrQ=',
183
- alipay_public_key: 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmy8gfxY5RFBKixIWoflLqULF1gZ43QdlEYln+1f0k+tbiWbhi3DBOKp9gjgGmOJmBzVuaDQ+VMDmrolIc8tOz6urQU2PSjMSSqLub3xwyxiZO2qjfkn5riO68ITkr3RN7zVyZcheoaTfexygtg7xH8eqbqhghnVs97KwKnkIt7mzhIvbs60qrV8YAkbm6Hw85s4BVBoBleFZPQCBDXffVTz72GGu5iFHcbVoZdtT2GKPWWiaYb9BEuzzmUo41pPdHrMYP0VnR9UdGnLZyC70YXQ6ZshRux0/rkIrxLGVlk5UBTqdxtP8r2oqoVLl4L5tBcTw4gRPqL4+UiDQ7YE3ZQIDAQAB',
184
- encrypt_key: 'rEoolKE9DfJIQHMMelZapw=='
185
- )
186
-
187
- # 2. 发起WAP支付API调用 - 与PHP版本完全相同的参数
188
- response = Alipay::EasySDK.wap
189
- .optional("seller_id", "2036665393371081") # 可选:设置卖家支付宝用户ID
190
- .pay(
191
- "1123", # 商品名称 - 与PHP版本一致
192
- "70501111111S001111119", # 商户订单号
193
- "9.00", # 支付金额
194
- "https://your-quit-url.com", # 用户付款中途退出返回商户网站的地址
195
- "https://your-return-url.com" # 用户付款成功返回商户网站的地址
196
- )
197
-
198
- # 3. 处理响应或异常
199
- if response.success?
200
- puts "调用成功"
201
- puts "支付表单HTML: #{response.form}" if response.form
202
-
203
- # 4. 提取form表单中的action URL和所有参数 - 完全按照PHP版本逻辑
204
- form_html = response.form
205
- action_url = extract_action_url(form_html)
206
- all_params = extract_all_form_params(form_html)
207
-
208
- puts "Action URL: #{action_url}"
209
- puts "表单参数数量: #{all_params.length}"
210
- all_params.each do |key, value|
211
- puts " #{key}: #{value}"
212
- end
213
-
214
- # 5. action URL已经在第4步提取完成,无需重复提取
215
-
216
- # 6. 现在Ruby版本的表单结构与PHP一致,所有参数都在input字段中
217
- # 直接使用提取的input参数
218
- combined_params = all_params
219
-
220
- puts "表单参数总数: #{combined_params.length}"
221
-
222
- # 7. 发送POST请求 - 使用基础URL和所有参数
223
- if action_url && !combined_params.empty?
224
- post_response = send_post_request(action_url, combined_params)
225
-
226
- # 8. 将响应保存到文件
227
- save_response_to_file(post_response, "alipay_ruby_response.txt")
228
- puts "响应已保存到 alipay_ruby_response.txt"
229
- end
230
-
231
- else
232
- puts "调用失败,原因:#{response.error_message}"
233
- end
234
-
235
- rescue => e
236
- puts "调用遭遇异常,原因:#{e.message}"
237
- puts e.backtrace.join("\n") if ENV['DEBUG']
238
- raise e
239
- end