From 9be668e2691c7309a107ee6abf81725b24d26412 Mon Sep 17 00:00:00 2001 From: yunzheng <42thcoder@gmail.com> Date: Tue, 25 Jul 2017 22:09:49 +0800 Subject: [PATCH 1/2] support sandbox --- bin/console | 16 ++++++++++++++++ lib/wx_pay.rb | 21 ++++++++++++++++++++- lib/wx_pay/service.rb | 34 ++++++++++++++++++++++------------ 3 files changed, 58 insertions(+), 13 deletions(-) create mode 100755 bin/console diff --git a/bin/console b/bin/console new file mode 100755 index 0000000..61e2fde --- /dev/null +++ b/bin/console @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby + +lib = File.expand_path('../../lib', __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require 'wx_pay' + +begin + require 'pry' + Pry.start || exit +rescue LoadError + require 'irb' + require 'irb/completion' + + ARGV.clear + IRB.start +end diff --git a/lib/wx_pay.rb b/lib/wx_pay.rb index 949e75e..594fbc4 100644 --- a/lib/wx_pay.rb +++ b/lib/wx_pay.rb @@ -4,11 +4,15 @@ require 'openssl' module WxPay + SANDBOX_SIGNKEY_URL = 'https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey'.freeze + @extra_rest_client_options = {} @debug_mode = true + @sandbox = false + class<< self - attr_accessor :appid, :mch_id, :key, :appsecret, :extra_rest_client_options, :debug_mode + attr_accessor :appid, :mch_id, :key, :appsecret, :extra_rest_client_options, :debug_mode, :sandbox attr_reader :apiclient_cert, :apiclient_key def set_apiclient_by_pkcs12(str, pass) @@ -30,5 +34,20 @@ def apiclient_key=(key) def debug_mode? @debug_mode end + + def sandbox? + @sandbox + end + + def key + return @key if !sandbox? || @fetched_sandbox_key + + params = { mch_id: WxPay.mch_id, nonce_str: SecureRandom.uuid.tr('-', '') } + + response = WxPay::Service.post(SANDBOX_SIGNKEY_URL, params, {}) + + @key = response.fetch('http://github.com/sandbox_signkey') + @fetched_sandbox_key = true + end end end diff --git a/lib/wx_pay/service.rb b/lib/wx_pay/service.rb index 6cef801..518878d 100644 --- a/lib/wx_pay/service.rb +++ b/lib/wx_pay/service.rb @@ -8,6 +8,16 @@ module WxPay module Service GATEWAY_URL = 'https://api.mch.weixin.qq.com/' + def self.gateway_url + url = WxPay.sandbox? ? '/sandboxnew' : '' + + "#{GATEWAY_URL}#{url}" + end + + def self.post(url, params, options) + WxPay::Result.new(Hash.from_xml(invoke_remote(url, make_payload(params), options))) + end + def self.generate_authorize_url(http://github.com/redirect_uri,%20state%20=%20nil) state ||= SecureRandom.hex 16 "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{WxPay.appid}&redirect_uri=#{CGI::escape%20redirect_uri}&response_type=code&scope=snsapi_base&state=#{state}" @@ -48,7 +58,7 @@ def self.invoke_unifiedorder(params, options = {}) check_required_options(params, INVOKE_UNIFIEDORDER_REQUIRED_FIELDS) - r = WxPay::Result.new(Hash.from_xml(invoke_remote("#{GATEWAY_URL}/pay/unifiedorder", make_payload(params), options))) + r = WxPay::Result.new(Hash.from_xml(invoke_remote("#{gateway_url}/pay/unifiedorder", make_payload(params), options))) yield r if block_given? @@ -66,7 +76,7 @@ def self.invoke_closeorder(params, options = {}) check_required_options(params, INVOKE_CLOSEORDER_REQUIRED_FIELDS) - r = WxPay::Result.new(Hash.from_xml(invoke_remote("#{GATEWAY_URL}/pay/closeorder", make_payload(params), options))) + r = WxPay::Result.new(Hash.from_xml(invoke_remote("#{gateway_url}/pay/closeorder", make_payload(params), options))) yield r if block_given? @@ -127,7 +137,7 @@ def self.invoke_refund(params, options = {}) verify_ssl: OpenSSL::SSL::VERIFY_NONE }.merge(options) - r = WxPay::Result.new(Hash.from_xml(invoke_remote("#{GATEWAY_URL}/secapi/pay/refund", make_payload(params), options))) + r = WxPay::Result.new(Hash.from_xml(invoke_remote("#{gateway_url}/secapi/pay/refund", make_payload(params), options))) yield r if block_given? @@ -144,7 +154,7 @@ def self.refund_query(params, options = {}) check_required_options(params, ORDER_QUERY_REQUIRED_FIELDS) - r = WxPay::Result.new(Hash.from_xml(invoke_remote("#{GATEWAY_URL}/pay/refundquery", make_payload(params), options))) + r = WxPay::Result.new(Hash.from_xml(invoke_remote("#{gateway_url}/pay/refundquery", make_payload(params), options))) yield r if block_given? @@ -167,7 +177,7 @@ def self.invoke_transfer(params, options = {}) verify_ssl: OpenSSL::SSL::VERIFY_NONE }.merge(options) - r = WxPay::Result.new(Hash.from_xml(invoke_remote("#{GATEWAY_URL}/mmpaymkttransfers/promotion/transfers", make_payload(params), options))) + r = WxPay::Result.new(Hash.from_xml(invoke_remote("#{gateway_url}/mmpaymkttransfers/promotion/transfers", make_payload(params), options))) yield r if block_given? @@ -190,7 +200,7 @@ def self.gettransferinfo(params, options = {}) verify_ssl: OpenSSL::SSL::VERIFY_NONE }.merge(options) - r = WxPay::Result.new(Hash.from_xml(invoke_remote("#{GATEWAY_URL}/mmpaymkttransfers/gettransferinfo", make_payload(params), options))) + r = WxPay::Result.new(Hash.from_xml(invoke_remote("#{gateway_url}/mmpaymkttransfers/gettransferinfo", make_payload(params), options))) yield r if block_given? @@ -213,7 +223,7 @@ def self.invoke_reverse(params, options = {}) verify_ssl: OpenSSL::SSL::VERIFY_NONE }.merge(options) - r = WxPay::Result.new(Hash.from_xml(invoke_remote("#{GATEWAY_URL}/secapi/pay/reverse", make_payload(params), options))) + r = WxPay::Result.new(Hash.from_xml(invoke_remote("#{gateway_url}/secapi/pay/reverse", make_payload(params), options))) yield r if block_given? @@ -236,7 +246,7 @@ def self.invoke_micropay(params, options = {}) verify_ssl: OpenSSL::SSL::VERIFY_NONE }.merge(options) - r = WxPay::Result.new(Hash.from_xml(invoke_remote("#{GATEWAY_URL}/pay/micropay", make_payload(params), options))) + r = WxPay::Result.new(Hash.from_xml(invoke_remote("#{gateway_url}/pay/micropay", make_payload(params), options))) yield r if block_given? @@ -252,7 +262,7 @@ def self.order_query(params, options = {}) }.merge(params) - r = WxPay::Result.new(Hash.from_xml(invoke_remote("#{GATEWAY_URL}/pay/orderquery", make_payload(params), options))) + r = WxPay::Result.new(Hash.from_xml(invoke_remote("#{gateway_url}/pay/orderquery", make_payload(params), options))) check_required_options(params, ORDER_QUERY_REQUIRED_FIELDS) yield r if block_given? @@ -270,7 +280,7 @@ def self.download_bill(params, options = {}) check_required_options(params, DOWNLOAD_BILL_REQUIRED_FIELDS) - r = invoke_remote("#{GATEWAY_URL}/pay/downloadbill", make_payload(params), options) + r = invoke_remote("#{gateway_url}/pay/downloadbill", make_payload(params), options) yield r if block_given? @@ -292,7 +302,7 @@ def self.sendgroupredpack(params, options={}) verify_ssl: OpenSSL::SSL::VERIFY_NONE }.merge(options) - r = WxPay::Result.new(Hash.from_xml(invoke_remote("#{GATEWAY_URL}/mmpaymkttransfers/sendgroupredpack", make_payload(params), options))) + r = WxPay::Result.new(Hash.from_xml(invoke_remote("#{gateway_url}/mmpaymkttransfers/sendgroupredpack", make_payload(params), options))) yield r if block_given? @@ -314,7 +324,7 @@ def self.sendredpack(params, options={}) verify_ssl: OpenSSL::SSL::VERIFY_NONE }.merge(options) - r = WxPay::Result.new(Hash.from_xml(invoke_remote("#{GATEWAY_URL}/mmpaymkttransfers/sendredpack", make_payload(params), options))) + r = WxPay::Result.new(Hash.from_xml(invoke_remote("#{gateway_url}/mmpaymkttransfers/sendredpack", make_payload(params), options))) yield r if block_given? From 5f6949ea283007e0f08445fc75b9895f7403bbc5 Mon Sep 17 00:00:00 2001 From: yunzheng <42thcoder@gmail.com> Date: Tue, 25 Jul 2017 22:21:47 +0800 Subject: [PATCH 2/2] Try to use rvm with version 2.1.1 instead of 2.1.0 to avoid CI failure. cc https://github.com/travis-ci/travis-ci/issues/2220 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3e8565b..323df40 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,7 @@ language: ruby before_install: - gem install bundler rvm: - - 2.1.0 + - 2.1.1 - 2.2.5 - 2.3.0 - 2.4.0