網(wǎng)站制作推薦新鴻儒seo引擎優(yōu)化
1、申請沙箱環(huán)境
#需要填一些個人信息
https://opendocs.alipay.com/
2、使用支付寶登入,并進(jìn)入控制臺,進(jìn)入'開發(fā)者工具推薦'-->'沙箱'
3、獲取基本信息
主要是APPID,和支付寶網(wǎng)關(guān)地址
4、生成應(yīng)用私鑰和應(yīng)用公鑰和支付寶公鑰
上面的接口加簽方式選擇系統(tǒng)默認(rèn)密鑰
注:這里有個坑,如果選擇自定密鑰,后面回調(diào)驗(yàn)簽會不成功。
點(diǎn)擊查看,可以看到應(yīng)用私鑰和應(yīng)用公鑰和支付寶公鑰
6、沙箱賬號
這里用商家和買家的賬號信息,也可以進(jìn)行充值
7、下載支付寶沙箱APP
8、在手機(jī)上用買家賬號和密碼登入登入支付寶沙箱APP
9、下載并安裝支付寶SDK
pip3 install alipay-sdk-python
10、生成支付鏈接
在視圖函數(shù)中調(diào)用止函數(shù)即可生成支付鏈接。
import logging
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 AlipayTradePayResponsedef alpay_page(order_id,total_amount,subject,return_url,notify_url):"""功能:網(wǎng)頁生成支付寶支付頁面:param order_id:訂單號(str):param total_amount:訂單金額(float):param subject:訂單標(biāo)題:param return_url:同步回調(diào)地址:param notify_url:異步回調(diào)地址"""logging.basicConfig(level=logging.INFO,format='%(asctime)s %(levelname)s %(message)s',filemode='a', )logger = logging.getLogger('')"""設(shè)置配置,包括支付寶網(wǎng)關(guān)地址、app_id、應(yīng)用私鑰、支付寶公鑰等,其他配置值可以查看AlipayClientConfig的定義。"""alipay_client_config = AlipayClientConfig() #創(chuàng)建用戶對象配置文件 alipay_client_config.server_url = project1.settings.gateway #支付寶網(wǎng)關(guān)alipay_client_config.app_id = project1.settings.APPID #支付寶APPIDalipay_client_config.app_private_key = project1.settings.private_key #應(yīng)用私鑰alipay_client_config.alipay_public_key = project1.settings.public_key #支付寶公鑰alipay_client_config.charset = 'utf-8' """得到客戶端對象。注意,一個alipay_client_config對象對應(yīng)一個DefaultAlipayClient,定義DefaultAlipayClient對象后,alipay_client_config不得修改,如果想使用不同的配置,請定義不同的DefaultAlipayClient。logger參數(shù)用于打印日志,不傳則不打印,建議傳遞。"""client = DefaultAlipayClient(alipay_client_config=alipay_client_config,logger=logger)model = AlipayTradePagePayModel()model.out_trade_no = order_idmodel.total_amount = total_amountmodel.subject = subjectmodel.body = "支付寶測試"model.product_code = "FAST_INSTANT_TRADE_PAY"#下面這些注釋掉的,是交易的詳細(xì)信息,有些在沙箱環(huán)境中似乎不能用。# 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 = "2088721043828344"# model.sub_merchant = sub_merchantrequest = AlipayTradePagePayRequest(biz_model=model)request.notify_url = notify_url # 異步通知回調(diào)地址request.return_url = return_url # 同步回調(diào)地址# 得到構(gòu)造的請求,如果http_method是GET,則是一個帶完成請求參數(shù)的url,如果http_method是POST,則是一段HTML表單片段response = client.page_execute(request, http_method="GET")print("alipay.trade.page.pay response:" + response)return response #返回支付頁面url
11、支付寶回調(diào)
@csrf_exempt
def pay_callback(req):#支付寶回調(diào)函數(shù)#verify_with_rsa用于驗(yàn)簽from alipay.aop.api.util.SignatureUtils import verify_with_rsalog_file = os.path.join(settings.BASE_DIR, 'uwsgi/uwsgi.log')logging.basicConfig(filename=log_file, level=logging.DEBUG,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')def visa(data_dict):#驗(yàn)簽函數(shù)# 獲取并刪除signsign = data_dict.pop('sign')# 獲取并刪除sign_typesign_type = data_dict.pop('sign_type')# 將回傳參數(shù)排序(按ascii碼升序排序)并組合成字符串unsigned_str = '&'.join('{}={}'.format(key, data_dict[key]) for key in sorted(data_dict))# 將參數(shù)字符串編碼message = unsigned_str.encode('utf-8')# 獲取支付寶公鑰public_key = project1.settings.public_key# 支付寶回調(diào)驗(yàn)簽try:status = verify_with_rsa(public_key, message, sign)if status:return Trueelse:return Falseexcept BaseException as e:print(e)return Falseif req.method=='POST':#異步回調(diào)logging.debug('異步回調(diào)')data_dict=req.POST.dict()print('data',data_dict)if data_dict.get('trade_status')=='TRADE_SUCCESS':#判斷支付是否成功result = visa(data_dict) #調(diào)用驗(yàn)簽函數(shù)驗(yàn)簽print('異步回簽字結(jié)果', result)if result:#如果驗(yàn)簽成功,則更新訂單信息#這里寫上你自己的更新訂單代碼 #驗(yàn)簽成功后必須返回'sucess',否則支付寶會一直通過POST方式發(fā)送驗(yàn)簽信息return HttpResponse('success')return HttpResponse('unsuccess')return HttpResponse('unsuccess')elif req.method=='GET':#同步驗(yàn)簽#獲取支付寶回傳參數(shù)(字典) data_dict=req.GET.dict()result=visa(data_dict) #調(diào)用驗(yàn)簽函數(shù)驗(yàn)簽print('同步回簽字結(jié)果',result)if result==True:#驗(yàn)簽成功則更新訂單信息#這里寫上你自己的更新訂單代碼 context={#返回給用戶的信息,可自定義 'status':True,'order':data_dict.get('out_trade_no'), #訂單號 'total_amount':data_dict.get('total_amount'), #訂單金額'trade_no':data_dict.get('trade_no') #交易流水號}return render(req,'web/pay_success.html',context)else:return JsonResponse({'status':False})