1. 程式人生 > >Python3.6+Django1.11.3安裝支付寶SDK呼叫支付寶線上支付介面

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)

還有什麼問題的話,歡迎大家留言。