Class: EricWeixin::TwoDimensionCode

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/eric_weixin/two_dimension_code.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.get_long_time_two_dimension_code(options) ⇒ Object

获取永久性二维码对象. 典型使用场景如下: 1.第一步调用此方法先创建/获取二维码对象。 2.使用二维码对象获取二维码下载、展示链接。 如:two_dimension_code.image_url 3.尽情享受带参数的永久二维码吧,很简单,有木有?

参数描述:

  • app_id 微信app_id

  • scene_str 场景值,字符串长度不能超过64位,亦不能为空。

  • action_info 场景值描述(可选)

调用示例:

::EricWeixin::TwoDimensionCode.get_long_time_two_dimension_code app_id: 'wx51729870d9012531', scene_str: 'abc', action_info: 'hello'
::EricWeixin::TwoDimensionCode.get_long_time_two_dimension_code app_id: 'wx51729870d9012531', scene_str: 'bus'


37
38
39
40
41
42
43
44
45
46
47
48
49
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
75
# File 'app/models/eric_weixin/two_dimension_code.rb', line 37

def self.get_long_time_two_dimension_code options
  BusinessException.raise '场景值不能为空' if options[:scene_str].blank?
  BusinessException.raise '场景值不能超过64字符' if options[:scene_str].length > 63
  ::EricWeixin::TwoDimensionCode.transaction do
     = ::EricWeixin::PublicAccount.find_by_weixin_app_id options[:app_id]
    BusinessException.raise 'app_id不存在' if .blank?
    codes = .two_dimension_codes.where scene_str: options[:scene_str],
                                                     action_name: "QR_LIMIT_STR_SCENE"
    code = if codes.blank?
             code = ::EricWeixin::TwoDimensionCode.new weixin_public_account_id: .id,
                                                     action_name: "QR_LIMIT_STR_SCENE",
                                                     action_info: options[:action_info],
                                                     scene_str: options[:scene_str],
                                                     expire_at: Time.now.chinese_format
             code.save!
             code
           else
             codes[0]
           end
    if not code.ticket.blank?
      return code  #永久性二维码,不需要再次进行更新。
    end
    token = ::EricWeixin::AccessToken.get_valid_access_token_by_app_id app_id: options[:app_id]
    url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=#{token}"
    json = {:action_name => 'QR_LIMIT_STR_SCENE',
            :action_info => {
                :scene => {
                    :scene_str => options[:scene_str]
                }
            }}.to_json
    response = RestClient.post url, json
    response = JSON.parse response.body
    pp response
    code.ticket = response["ticket"]
    code.url = response["url"]
    code.save!
    code
  end
end

.get_short_time_two_dimension_code(options) ⇒ Object

获取临时二维码对象. 典型使用场景如下: 1.第一步调用此方法先创建/获取二维码对象。 2.使用二维码对象获取二维码下载、展示链接。 如:two_dimension_code.image_url 3.尽情享受带参数的永久二维码吧,很简单,有木有?

参数描述:

  • app_id 微信app_id

  • scene_id 场景值,应该是一个数字

  • expire_seconds 过期时间,默认为604800秒,可选

调用示例:

::EricWeixin::TwoDimensionCode.get_short_time_two_dimension_code app_id: 'wx51729870d9012531', scene_id: 1, expire_seconds: 3600
::EricWeixin::TwoDimensionCode.get_short_time_two_dimension_code app_id: 'wx51729870d9012531', scene_id: 2300


90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'app/models/eric_weixin/two_dimension_code.rb', line 90

def self.get_short_time_two_dimension_code options
  BusinessException.raise '场景值不能为空' if options[:scene_id].blank?

  ::EricWeixin::TwoDimensionCode.transaction do
     = ::EricWeixin::PublicAccount.find_by_weixin_app_id options[:app_id]
    BusinessException.raise 'app_id不存在' if .blank?
    #查询有效期内的临时二维码
    codes = .two_dimension_codes.where ["scene_id = ? and action_name = ? and expire_at > ?",
                                                      options[:scene_id],
                                                      "QR_SCENE",
                                                      Time.now.chinese_format
                                                     ]

    code = if codes.blank?
             code = ::EricWeixin::TwoDimensionCode.new weixin_public_account_id: .id,
                                                     action_name: "QR_SCENE",
                                                     scene_id: options[:scene_id],
                                                     expire_at: (Time.now + (options[:expire_seconds]||604800).to_i)
             code.save!
             code
           else
             codes[0]
           end
    if not code.ticket.blank?
      return code
    end
    token = ::EricWeixin::AccessToken.get_valid_access_token_by_app_id app_id: options[:app_id]
    url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=#{token}"
    json = {:action_name => 'QR_SCENE',
            :expire_seconds => (options[:expire_seconds]||604800).to_i,
            :action_info => {
                :scene => {
                    :scene_id => options[:scene_id]
                }
            }}.to_json
    response = RestClient.post url, json
    response = JSON.parse response.body
    pp response
    code.ticket = response["ticket"]
    code.url = response["url"]
    code.expire_at = Time.now + (options[:expire_seconds]||604800).to_i
    code.save!
    code
  end
end

.short_url(options) ⇒ Object

长URL转短URL.

参数说明:

  • app_id 微信公众账号的app_id

  • url 需要转短url的链接

调用示例:

EricWeixin::TwoDimensionCode.short_url app_id: 'wx51729870d9012531', url: 'http://mp.wz.qq.com/wiki/10/165c9b15eddcfbd8699ac12b0bd89ae6.html'


144
145
146
147
148
149
150
# File 'app/models/eric_weixin/two_dimension_code.rb', line 144

def self.short_url options
  access_token = ::EricWeixin::AccessToken.get_valid_access_token_by_app_id app_id: options[:app_id]
  url = "https://api.weixin.qq.com/cgi-bin/shorturl?access_token=#{access_token}"
  response = RestClient.post url, {action: "long2short", long_url: options[:url]}.to_json
  response = JSON.parse(response.body)
  response["short_url"]
end

Instance Method Details

#check_scene_str_lengthObject



7
8
9
10
# File 'app/models/eric_weixin/two_dimension_code.rb', line 7

def check_scene_str_length
  return if self.scene_str.blank?
  BusinessException.raise '永久性二维码场景值不能超过64位' if self.scene_str.length > 64
end

#encode_ticketObject



12
13
14
# File 'app/models/eric_weixin/two_dimension_code.rb', line 12

def encode_ticket
  CGI::escape(self.ticket)
end

#image_urlObject

获取二维码网址.

参数说明

  • 无。

调用示例

::EricWeixin::TwoDimensionCode.image_url



21
22
23
# File 'app/models/eric_weixin/two_dimension_code.rb', line 21

def image_url
  "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=#{self.encode_ticket}"
end