吐槽
相對於起步早的微信小程序來說,網上有關支付寶小程序的相關案例要少許多(一問度娘,皆是微信小程序),更別說用python來實現支付寶小程序後端的案例了,可以說是大海撈針。所以,打算在此記錄下個人開發支付寶小程序遇到的一些問題,如有失誤之處,還請體諒。
準備
1.自行註冊支付寶小程序
2.註冊成功後在開發中心—小程序應用—選擇小程序—開發管理–功能列表中添加‘獲取會員基礎信息’的功能。
3.下載RSA簽名工具(用於生成應用私鑰和應用公鑰)
具體步驟看說明就行:
4.下載RSA簽名工具成功,運行:RSA簽名驗籤工具.bat
(爲了安全起見,作者體驗了一次厚塗的藝術。)
生成應用私鑰和應用公鑰後,複製應用公鑰,記得在‘開發中心—小程序應用—選擇小程序-設置–開發設置–設置接口加密方式‘
開始代碼
記得在Django或者python中安裝alipay SDK,方式:pip install alipay-sdk-python
支付寶小程序部分
獲取會員基礎信息,需要authCode這個東東。
onLoad(options) {
// my.getAuthCode可以在不通過後端的方式獲取用戶頭像和用戶名。但無法獲取到user_id
my.getAuthCode({
scopes: 'auth_user',
success: (res) => {
my.getAuthUserInfo({
scopes: ['auth_user'],
success: (res) => {
this.setData({
//用戶名
name:res.nickName,
// 頭像鏈接
src1:res.avatar
})
},
fail:() =>{
reject({});
}
});
// 請求後臺,獲取user_id
if(res.authCode){
my.httpRequest({
url: '',// 填寫目標服務器url
method:'GET',
dataType: 'json',
data:{
code:res.authCode
},
success: res => {
console.log('請求成功')
console.log(res)
},
fail: res => {
console.log('請求失敗')
}
});
}
},
Python後端(Django)
#導入必要的包
from django.http import JsonResponse,HttpResponse
from alipay.aop.api.DefaultAlipayClient import DefaultAlipayClient
from alipay.aop.api.request.AlipaySystemOauthTokenRequest import AlipaySystemOauthTokenRequest
from alipay.aop.api.AlipayClientConfig import AlipayClientConfig
import json
def get_user(request):
#小程序端傳來的res.authCode
code1 = request.GET['code']
alipay_client_config = AlipayClientConfig()
alipay_client_config.server_url = 'https://openapi.alipay.com/gateway.do'
alipay_client_config.app_id = '小程序的APPID'
# 應用私鑰
alipay_client_config.app_private_key = '填入應用私鑰'
# 支付寶公鑰
alipay_client_config.alipay_public_key = '填入支付寶公鑰'
AlipayClient = DefaultAlipayClient(alipay_client_config)
request11 = AlipaySystemOauthTokenRequest()
request11.grant_type = 'authorization_code'
request11.code = code1
user_info_dict = AlipayClient.execute(request11)
result = json.loads(user_info_dict)
#也可以獲取到access_token
access_token = result['access_token']
user_id = result['user_id']
print(user_id)
#將整個result返回給小程序端,也可以拆開返回
return JsonResponse(result)