Python3.6+Django1.11.3安裝支付寶SDK呼叫支付寶線上支付介面
準備工作
首先需要註冊成為螞蟻金服的開發者
https://openhome.alipay.com/platform/manageHome.htm
接著就是下載支付寶的祕鑰生成工具。
RSA簽名驗籤工具windows_V1.4
教程支付寶的官方文件已經寫的很詳細了:https://docs.open.alipay.com/291/105971
這裡我們選擇PKCS1,非java版的
儲存好你的公鑰和私鑰
然後將應用公鑰貼上到支付寶頁面
下面的應用閘道器什麼的是選填,具體使用方法看官方文件,沒有比那個還詳細的了。
點選左上角的沙箱賬號和沙箱應用,下載你的沙箱版支付寶,用於測試使用。使用沙箱賬號登入。
接下來開始安裝支付寶的SDK
下載支付寶的SDK:https://pypi.org/project/alipay-sdk-python/#files
我尋思著解壓後你會得到兩個檔案,一個安裝不上就安裝另一個吧。
安裝命令,(有虛擬環境的就進入到你的虛擬環境中):
pip install [F:\.......]替換成你的檔案路徑,記得加檔名。切記路徑中不要包含空格。
我尋思著你哪個也安裝不上,會提示你編譯錯誤。
你也可以試試官方的安裝命令:pip install alipay-sdk-python
不行的話就按我的來吧。
先安裝pycrypto:pip install pycrypto
下載到本地安裝也行。 網址:https://pypi.org/project/pycrypto/#files
再安裝支付寶SDK:pip install [F:\.......]替換成你的檔案路徑。推薦安裝cp36
這是編譯安裝,會比較慢。
到這裡準備工作算是結束了。
開始動手
第一步:檢視官方文件
地址:https://pypi.org/project/alipay-sdk-python/#description
這裡我就給例程全部貼上過來了。選取你想用的即可。
記得把所有的import全部貼上過去,最後我們再刪掉灰色的就好。
#!/usr/bin/env python # -*- coding: utf-8 -*- import logging import traceback from alipay.aop.api.AlipayClientConfig import AlipayClientConfig from alipay.aop.api.DefaultAlipayClient import DefaultAlipayClient from alipay.aop.api.FileItem import FileItem from alipay.aop.api.domain.AlipayTradeAppPayModel import AlipayTradeAppPayModel from alipay.aop.api.domain.AlipayTradePagePayModel import AlipayTradePagePayModel from alipay.aop.api.domain.AlipayTradePayModel import AlipayTradePayModel from alipay.aop.api.domain.GoodsDetail import GoodsDetail from alipay.aop.api.domain.SettleDetailInfo import SettleDetailInfo from alipay.aop.api.domain.SettleInfo import SettleInfo from alipay.aop.api.domain.SubMerchant import SubMerchant from alipay.aop.api.request.AlipayOfflineMaterialImageUploadRequest import AlipayOfflineMaterialImageUploadRequest from alipay.aop.api.request.AlipayTradeAppPayRequest import AlipayTradeAppPayRequest from alipay.aop.api.request.AlipayTradePagePayRequest import AlipayTradePagePayRequest from alipay.aop.api.request.AlipayTradePayRequest import AlipayTradePayRequest from alipay.aop.api.response.AlipayOfflineMaterialImageUploadResponse import AlipayOfflineMaterialImageUploadResponse from alipay.aop.api.response.AlipayTradePayResponse import AlipayTradePayResponse logging.basicConfig( level=logging.INFO, format='%(asctime)s %(levelname)s %(message)s', filemode='a',) logger = logging.getLogger('') if __name__ == '__main__': """ 設定配置,包括支付寶閘道器地址、app_id、應用私鑰、支付寶公鑰等,其他配置值可以檢視AlipayClientConfig的定義。 """ alipay_client_config = AlipayClientConfig() alipay_client_config.server_url = 'https://openapi.alipay.com/gateway.do' alipay_client_config.app_id = '[your app_id]' alipay_client_config.app_private_key = '[your app private key]' alipay_client_config.alipay_public_key = '[alipay public key]' """ 得到客戶端物件。 注意,一個alipay_client_config物件對應一個DefaultAlipayClient,定義DefaultAlipayClient物件後,alipay_client_config不得修改,如果想使用不同的配置,請定義不同的DefaultAlipayClient。 logger引數用於列印日誌,不傳則不列印,建議傳遞。 """ client = DefaultAlipayClient(alipay_client_config=alipay_client_config, logger=logger) """ 系統介面示例:alipay.trade.pay """ # 對照介面文件,構造請求物件 model = AlipayTradePayModel() model.auth_code = "282877775259787048" model.body = "Iphone6 16G" goods_list = list() goods1 = GoodsDetail() goods1.goods_id = "apple-01" goods1.goods_name = "ipad" goods1.price = 10 goods1.quantity = 1 goods_list.append(goods1) model.goods_detail = goods_list model.operator_id = "yx_001" model.out_trade_no = "20180510AB014" model.product_code = "FACE_TO_FACE_PAYMENT" model.scene = "bar_code" model.store_id = "" model.subject = "huabeitest" model.timeout_express = "90m" model.total_amount = 1 request = AlipayTradePayRequest(biz_model=model) # 如果有auth_token、app_auth_token等其他公共引數,放在udf_params中 # udf_params = dict() # from alipay.aop.api.constant.ParamConstants import * # udf_params[P_APP_AUTH_TOKEN] = "xxxxxxx" # request.udf_params = udf_params # 執行請求,執行過程中如果發生異常,會丟擲,請列印異常棧 response_content = None try: response_content = client.execute(request) except Exception as e: print(traceback.format_exc()) if not response_content: print("failed execute") else: response = AlipayTradePayResponse() # 解析響應結果 response.parse_response_content(response_content) print(response.body) if response.is_success(): # 如果業務成功,則通過respnse屬性獲取需要的值 print("get response trade_no:" + response.trade_no) else: # 如果業務失敗,則從錯誤碼中可以得知錯誤情況,具體錯誤碼資訊可以檢視介面文件 print(response.code + "," + response.msg + "," + response.sub_code + "," + response.sub_msg) """ 帶檔案的系統介面示例:alipay.offline.material.image.upload """ # 如果沒有找到對應Model類,則直接使用Request類,屬性在Request類中 request = AlipayOfflineMaterialImageUploadRequest() request.image_name = "我的店" request.image_type = "jpg" # 設定檔案引數 f = open("/Users/foo/Downloads/IMG.jpg", "rb") request.image_content = FileItem(file_name="IMG.jpg", file_content=f.read()) f.close() response_content = None try: response_content = client.execute(request) except Exception as e: print(traceback.format_exc()) if not response_content: print("failed execute") else: response = AlipayOfflineMaterialImageUploadResponse() response.parse_response_content(response_content) if response.is_success(): print("get response image_url:" + response.image_url) else: print(response.code + "," + response.msg + "," + response.sub_code + "," + response.sub_msg) """ 頁面介面示例:alipay.trade.page.pay """ # 對照介面文件,構造請求物件 model = AlipayTradePagePayModel() model.out_trade_no = "pay201805020000226" model.total_amount = 50 model.subject = "測試" model.body = "支付寶測試" model.product_code = "FAST_INSTANT_TRADE_PAY" settle_detail_info = SettleDetailInfo() settle_detail_info.amount = 50 settle_detail_info.trans_in_type = "userId" settle_detail_info.trans_in = "2088302300165604" settle_detail_infos = list() settle_detail_infos.append(settle_detail_info) settle_info = SettleInfo() settle_info.settle_detail_infos = settle_detail_infos model.settle_info = settle_info sub_merchant = SubMerchant() sub_merchant.merchant_id = "2088301300153242" model.sub_merchant = sub_merchant request = AlipayTradePagePayRequest(biz_model=model) # 得到構造的請求,如果http_method是GET,則是一個帶完成請求引數的url,如果http_method是POST,則是一段HTML表單片段 response = client.page_execute(request, http_method="GET") print("alipay.trade.page.pay response:" + response) """ 構造喚起支付寶客戶端支付時傳遞的請求串示例:alipay.trade.app.pay """ model = AlipayTradeAppPayModel() model.timeout_express = "90m" model.total_amount = "9.00" model.seller_id = "2088301194649043" model.product_code = "QUICK_MSECURITY_PAY" model.body = "Iphone6 16G" model.subject = "iphone" model.out_trade_no = "201800000001201" request = AlipayTradeAppPayRequest(biz_model=model) response = client.sdk_execute(request) print("alipay.trade.app.pay response:" + response)
還有什麼問題的話,歡迎大家留言。