Python實現微信小程序用戶登錄、模板推送!玩轉微信所有功能!

小程序可以通過官方提供的登錄鄧麗來獲取用戶身份的標示, 具體文檔可以參考 官方文檔, 通過流程時序可以看到, 對於需要和前端配合的服務端開發, 主要實現的就是通過小程序提供的 code 換取用戶的 openid 和 session_key, 並用換取到的 openid 和 secret_key 作為自定義的登錄態. 分析後得知, 作為小程序後端的開發, 主要實現以下幾部分內容:

  • 提供一個 HTTP 接口, 供小程序方使用, 傳遞code;
  • 換取用戶身份標識;
  • 維護一個自定義的登錄態;
  • 需要存儲用戶的 openid , 以備後續使用.

1.提供給小程序一個 HTTP 接口, 接口而使用 Tornado 框架

簡化闡述, 代碼沒有做異常處理

<code>

class

LoginHandler

(

RequestHandler

):

def

post

(

self

)

: req_data = json.loads(

self

.request.body) js_code = req_data.get(

'js_code'

) user_info = get_user_info(js_code=js_code) openid = user_info[

'openid'

] session_key = user_info[

'session_key'

] user_uuid = str(uuid.uuid4()) User.save_user_session( user_uuid=user_uuid, openid=openid, session_key=session_key )

self

.set_header(

'Authorization'

, user_uuid) User.save_user_info(open_id=openid)

self

.set_status(

204

)/<code>

2.換取用戶身份標示, 直接使用 Requests包 請求微信的相關接口, 獲取數據

<code>

def

get_user_info

(js_code)

:

req_params = {

"appid"

:

'app_id'

,

"secret"

:

'secret'

,

"js_code"

: js_code,

"grant_type"

:

'authorization_code'

} req_resutl = requests.get(

'https://api.weixin.qq.com/sns/jscode2session'

, params=req_params, timeout=

3

, verify=

False

)

return

req_result.json()/<code>

3.維護一個自定義的登錄態, 使用 Redis

<code>user_redis = StrictRedis.from_url(

'redis//localhost:6379'

)

class

User

(object)

:

REDIS_EXPIRES =

7

*

24

*

60

*

60

def

save_user_session

(cls, user_uuid, openid, session_key)

:

user_session_value = {

'openid'

:openid,

'session_key'

:session_key } user_session_key =

'US:'

+ user_uuid

with

user_redis.pipeline(transaction=

False

)

as

pipe: pipe.hmset(user_session_key, user_session_value) pipe.expire(user_session_key, cls.REDIS_EXPIRES) pipe.execute()/<code>

4.存儲用戶信息, 以備後用, ORM使用 SQLAlchemy

<code>

from

sqlalchemy

import

create_engine

from

sqlalchemy.ext.declarative

import

declarative_base engine = create_engine(

'mysql://root:pwd@localhost/wechat'

) conn = engine.connect() Base = declarative_base() Base.metadata.reflect(engine) tables = Base.metadata.tables

class

User

(object)

:

table = tables[

'user'

]

def

save_user_info

(cls, open_id)

:

sql = cls.table.insert().values(open_id=open_id) conn.execute(sql)/<code>

SQL 語句

<code>

CREATE

TABLE

`user`

(

`id`

int

(

20

)

unsigned

NOT

NULL

AUTO_INCREMENT,

`open_id`

varchar

(

32

)

NOT

NULL

COMMENT

'用戶 open_id'

,

`created_at`

timestamp

NULL

DEFAULT

CURRENT_TIMESTAMP

COMMENT

'創建時間'

,

`updated_at`

timestamp

NULL

DEFAULT

CURRENT_TIMESTAMP

ON

UPDATE

CURRENT_TIMESTAMP

COMMENT

'更新時間'

, PRIMARY

KEY

(

`id`

),

KEY

`idx_oid`

(

`open_id`

) )

ENGINE

=

InnoDB

default

CHARSET

=utf8mb4;/<code>

Template: 通過代碼發送微信模板消息

<code>

import

json

import

requests

from

redis

import

StrictRedis

from

tornado.web

import

RequestHandler redis = StrictRedis.from_url(

'redis//localhost:6379'

)

def

get_access_token

()

:

payload = {

'grant_type'

:

'client_credential'

,

'appid'

:

'appid'

,

'secret'

:

'secret'

} req = requests.get(

'https://api.weixin.qq.com/cgi-bin/token'

, params=payload, timeout=

3

, verify=

False

) access_token = req.json().get(

'access_token'

) redis.set(

'ACCESS_TOKEN'

, access_token)

class

FormHandler

(RequestHandler)

:

def

post

(self)

:

req_data = self.request.body req_data = json.loads(req_data) form_id = req_data.get(

'from_id'

) remplate_push(form_id)

def

template_push

(form_id)

:

data = {

"touser"

:

'open_id'

,

"template_id"

:

'template_id'

,

"page"

:

'pages/index/index'

,

"form_id"

: form_id,

"data"

:{

"keyword1"

:{

"value"

:

"value"

} }

"emphasis_keyword"

:

''

} access_token = redis.get(

'ACCESS_TOKEN'

) push_url =

'https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token={}'

.format(access_token) requests.post(push_url, json=data, timeout=

3

, verify=

False

)/<code>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持我們。


分享到:


相關文章: