ä¸ãåè¨
æ¥èå³å°æ¥ä¸´ï¼å¤§å®¶è¯å®åç§æè °å è±è±è±ï¼å°ç¼ç¸ä¿¡å¤§å®¶å¨æ¯ä»æ¶åï¼å¾®ä¿¡ãæ¯ä»å®æ¯ä»è¯å®æ¯ä¼å éæ©ãä»å¤©å°ç¼å¿è¡æ¥æ½®ï¼ä¸ºå¤§å®¶å¸¦æ¥ä¸ä¸ªå¾æè¶£ç项ç®ï¼é£å°±æ¯ä½¿ç¨Python webæ¡æ¶Djangoæ¥å®ç°æ¯ä»å®æ¯ä»ï¼åºè¯ä¸å¤è¯´ï¼ä¸èµ·æ¥ççå¦ä½å®ç°å§ã
äºã建ç«djangoåºç¨
æä»¬æ¥å»ºç«ä¸ä¸ªDjango项ç®ç¶åå¨éé¢å建ä¸ä¸ªåºç¨ï¼å¦å¾ï¼
ä¸ãé 置并å¯å¨
ç¶åæä»¬è®¾ç½®urlsæä»¶çå 容ï¼å¦å¾ï¼
ç¶ååå¨ååºç¨ä¸å建ä¸ä¸ªurls.pyæä»¶ï¼å½ç¶ä½ ä¹å¯ä»¥ç´æ¥å°ä¸äºè§å¾å½æ°åå¨é¡¹ç®ä¸çurls.pyæä»¶ä¸ãæåæä»¬ç¼åè§å¾å½æ°å¹¶æè§å¾å½æ°æ·»å å°urls.pyæä»¶ä¸ï¼å¦å¾ï¼
æåæä»¬éè¦æäº¤æ´æ¹ï¼æå¼è¯¥é¡¹ç®manage.pyæä»¶æå¨çç®å½å¹¶æå¼cmdï¼è¾å ¥å¦ä¸å½ä»¤ï¼
python manage.py migrate
ç°å¨è®©æä»¬æ¥æ¬å°è·è·è¿ä¸ªé¡¹ç®ï¼è¿æ¯å¨è¯¥ç®å½ä¸ï¼å¦ä¸ï¼
python manage.py runserver
çå°è¾åºçç»æè¡¨æè¿ä¸ªååºç¨å·²ç»å¯å¨å¹¶è¿åäºç»æãæä»¬ä¹å¯ä»¥ä¸ç¨ç»è¿ååºç¨ç´æ¥å¨å建çé¡¹ç®æ ¹ç®å½ä¸è¿è¡å¯å¨Djangoåºç¨ï¼é¦å å¨payç®å½ä¸æ°å»ºä¸ä¸ªview.pyæä»¶ï¼ç¶åå°å ¶æ·»å å°è¯¥ç®å½ä¸çurls.pyæä»¶ä¸ï¼å¦ä¸ï¼
è¿è¡ä¸çå¾ï¼
åãç»å½æ¯ä»å®å¹¶çærsaå¯é¥
é¦å ç»å½å±ä»¬è¦æ¶æ¬¾çæ¯ä»å®ï¼å°åï¼
https://auth.alipay.com/login/ant_sso_index.htm?goto=https%3A%2F%2Fopenhome.alipay.com%2Fplatform%2FappDaily.htm%3Ftab%3Dinfo
ç¶åè¿è¡ç»å½ï¼å¦å¾ï¼
ç¶åç¹å»RSA2(SHA256)åé¢ç设置ï¼ç¹å»å ¬é¥å¹¶ä¸è½½æ¯ä»å®å¯é¥çæå¨æè opensslæ¥çæå¯é¥ï¼è¿éæéæ©æ¯ä»å®å¯é¥çæå¨ï¼å¦å¾ï¼
ç¶åç¹å»å®ä¹å跳转å°ä¸è½½çé¢ä¸è½½ï¼å¦å¾ï¼
ä¸è½½å¥½åæå¼è¯¥å·¥å ·ï¼éæ©å¥½å¯é¥é¿åº¦åå¯é¥æ ¼å¼å¹¶çæå¯é¥ï¼å¦å¾ï¼
ç¶åè¿å ¥å ¬ç§é¥çç®å½ï¼å°è¿ä¸ªå¤å¶å°æä»¬çDjango项ç®çååºç¨ç®å½ä¸ï¼å¹¶éå½åï¼çä¸ç¨ççï¼å¦å¾ï¼
ç´§æ¥çæä»¬è¿å ¥èªå·±çå¼åè ä¸å¿æ§å¶å°ï¼å°åï¼
https://open.alipay.com/platform/developerIndex.htm
ç¶åæä»¬å»å建ä¸ä¸ªåºç¨ï¼å¦å¾ï¼
æç §è¦æ±å¦å®å¡«åå³å¯ãç¶åæä»¬æ¥è®¾ç½®å®çæ¥å£å 坿¹å¼ï¼å¦å¾ï¼
éªè¯å¥½äºä¹åå¡«åååçæçåºç¨å ¬é¥ï¼å¦å¾ï¼
æ¤æ¶ä¼åºç°åºç¨å ¬é¥åæ¯ä»å®å ¬é¥ï¼å°æ¯ä»å®å ¬é¥ä¿åèµ·æ¥ï¼å¦å¾ï¼
ç¶åæä»¬å°äº§ççé¢åºç¨å ¬ç§é¥åæ¯ä»å®å ¬é¥ä¿å为ä¸åå 容形å¼çæä»¶ï¼å¦å¾ï¼
å°è¿ä¸ä¸ªæä»¶é½ä¿åå¨rsakeyè¿ä¸ªæä»¶å¤¹ä¸ãç°å¨åå¤å·¥ä½é½å好äºï¼ä¸é¢å¼å§ç¼åæ¯ä»å®æ¯ä»æ¥å£ã
注ï¼é¡¹ç®å®¡æ ¸éè¿åæå¯ä»¥ä½¿ç¨å¯é¥è°ç¨æ¯ä»å®æ¥å£å¢!
åãPC端æ¯ä»å®æ¯ä»æ¥å£
è¿éæä»¬ä½¿ç¨ä¸ä¸ªç±»å°å®å°è£ èµ·æ¥ï¼å¦ä¸ï¼
from datetime import datetime
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA256
from urllib.parse import quote_plus
from urllib.parse import urlparse, parse_qs
from base64 import decodebytes, encodebytes
import json
class AliPay(object):
"""
æ¯ä»å®æ¯ä»æ¥å£(PC端æ¯ä»æ¥å£)
"""
def __init__(self, appid, app_notify_url, app_private_key_path,
alipay_public_key_path, return_url, debug=False):
self.appid = appid
self.app_notify_url = app_notify_url
self.app_private_key_path = app_private_key_path
self.app_private_key = None
self.return_url = return_url
with open(self.app_private_key_path) as fp:
self.app_private_key = RSA.importKey(fp.read())
self.alipay_public_key_path = alipay_public_key_path
with open(self.alipay_public_key_path) as fp:
self.alipay_public_key = RSA.importKey(fp.read())
if debug is True:
self.__gateway = "https://openapi.alipaydev.com/gateway.do"
else:
self.__gateway = "https://openapi.alipay.com/gateway.do"
def direct_pay(self, subject, out_trade_no, total_amount, return_url=None, **kwargs):
biz_content = {
"subject": subject,
"out_trade_no": out_trade_no,
"total_amount": total_amount,
"product_code": "FAST_INSTANT_TRADE_PAY",
# "qr_pay_mode":4
}
biz_content.update(kwargs)
data = self.build_body("alipay.trade.page.pay", biz_content, self.return_url)
return self.sign_data(data)
def build_body(self, method, biz_content, return_url=None):
data = {
"app_id": self.appid,
"method": method,
"charset": "utf-8",
"sign_type": "RSA2",
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"version": "1.0",
"biz_content": biz_content
}
if return_url is not None:
data["notify_url"] = self.app_notify_url
data["return_url"] = self.return_url
return data
def sign_data(self, data):
data.pop("sign", None)
# æåºåçå符串
unsigned_items = self.ordered_data(data)
unsigned_string = "&".join("{0}={1}".format(k, v) for k, v in unsigned_items)
sign = self.sign(unsigned_string.encode("utf-8"))
# ordered_items = self.ordered_data(data)
quoted_string = "&".join("{0}={1}".format(k, quote_plus(v)) for k, v in unsigned_items)
# è·å¾æç»ç订åä¿¡æ¯å符串
signed_string = quoted_string + "&sign=" + quote_plus(sign)
return signed_string
def ordered_data(self, data):
complex_keys = []
for key, value in data.items():
if isinstance(value, dict):
complex_keys.append(key)
# å°åå
¸ç±»åçæ°æ®dumpåºæ¥
for key in complex_keys:
data[key] = json.dumps(data[key], separators=(',', ':'))
return sorted([(k, v) for k, v in data.items()])
def sign(self, unsigned_string):
# å¼å§è®¡ç®ç¾å
key = self.app_private_key
signer = PKCS1_v1_5.new(key)
signature = signer.sign(SHA256.new(unsigned_string))
# base64 ç¼ç ï¼è½¬æ¢ä¸ºunicode表示并移é¤å车
sign = encodebytes(signature).decode("utf8").replace("\n", "")
return sign
def _verify(self, raw_content, signature):
# å¼å§è®¡ç®ç¾å
key = self.alipay_public_key
signer = PKCS1_v1_5.new(key)
digest = SHA256.new()
digest.update(raw_content.encode("utf8"))
if signer.verify(digest, decodebytes(signature.encode("utf8"))):
return True
return False
def verify(self, data, signature):
if "sign_type" in data:
sign_type = data.pop("sign_type")
# æåºåçå符串
unsigned_items = self.ordered_data(data)
message = "&".join(u"{}={}".format(k, v) for k, v in unsigned_items)
return self._verify(message, signature)
为äºä¾¿äºè°ç¨ï¼æä»¬å°è¿ä¸ªPythonæä»¶æ¾å¨ååºç¨çç®å½ä¸ï¼å½å为pay.pyã
äºãç¼åå端页é¢
æä»¬éè¿å端çååçåç§°åä»·æ ¼æ¥çæå¯¹åºçååä¿¡æ¯å¹¶åèµ·ä»æ¬¾è¯·æ±ï¼å¦ä¸ï¼
index.html(åå主页)
Document æ¬¢è¿æ¥å°è´ç©ååº
| ååå | åååä»· | ååæ°é | æ¯å¦è´ä¹° |
| 梨å | 0.1 | 1 | è´ä¹° |
show.html(æ¯ä»ç»ææ¾ç¤ºé¡µ)
Document æ¯ä»ç»æï¼{{msg}}
å
ãç¼åè§å¾å½æ°å¤ç渲æ
from django.shortcuts import render,redirect
from django.http import HttpResponse,JsonResponse
from .pay import AliPay
import uuid
from urllib.parse import parse_qs
# Create your views here.
def index(request):
return render(request,'index.html')
def dingdan(request):
# å®ä¾åAliPay
alipay = AliPay(
appid="èªå·±çAPPID",
app_notify_url='http://127.0.0.1:8000/paypay/check/',#æ¯ä»å®ä¼åè¿ä¸ªå°ååépost请æ±
return_url='http://127.0.0.1:8000/paypay/show/',#æ¯ä»å®ä¼åè¿ä¸ªå°ååéget请æ±
app_private_key_path=r'C:\Users\Administrator\Desktop\pay\paypay\rsakey\private2048.txt', # åºç¨ç§é¥
alipay_public_key_path=r'C:\Users\Administrator\Desktop\pay\paypay\rsakey\paypublic.txt', # æ¯ä»å®å
¬é¥
debug=True, # é»è®¤æ¯False
)
# å®ä¹è¯·æ±å°åä¼ å
¥çåæ°
res=alipay.direct_pay(
subject='梨å', # ååæè¿°
out_trade_no=str(uuid.uuid4()), # 订åå·
total_amount='0.1', # 交æéé¢(å使¯å
ï¼ä¿ç两ä½å°æ°)
)
#çæè·³è½¬å°æ¯ä»å®æ¯ä»é¡µé¢çurl
url='https://openapi.alipaydev.com/gateway.do?{0}'.format(res)
return redirect(url)
def show(request):
if request.method == 'GET':
alipay = AliPay(
appid="èªå·±çAPPID",
app_notify_url='http://127.0.0.1:8000/paypay/check/',
return_url='http://127.0.0.1:8000/paypay/show/',
app_private_key_path=r'C:\Users\Administrator\Desktop\pay\paypay\rsakey\private2048.txt', # åºç¨ç§é¥
alipay_public_key_path=r'C:\Users\Administrator\Desktop\pay\paypay\rsakey\paypublic.txt', # æ¯ä»å®å
¬é¥
debug=True, # é»è®¤æ¯False
)
param=request.GET.dict() # è·åè¯·æ±æºå¸¦çåæ°å¹¶è½¬æ¢æåå
¸ç±»å
sign=param.pop('sign', None) # è·åsignçå¼
# 对signåæ°è¿è¡éªè¯
statu = alipay.verify(param,sign)
if statu:
return render(request, 'show.html', {'msg': 'æ¯ä»æå'})
else:
return render(request, 'show.html', {'msg': 'æ¯ä»å¤±è´¥'})
else:
return render(request, 'show.html', {'msg': 'åªæ¯æGET请æ±ï¼ä¸æ¯æå
¶å®è¯·æ±'})
def check(request):
if request.method=='POST':
alipay=AliPay(appid="èªå·±çAPPID",
app_notify_url='http://127.0.0.1:8000/paypay/check/', # æ¯ä»å®ä¼åè¿ä¸ªå°ååépost请æ±
return_url='http://127.0.0.1:8000/show_msg/', # æ¯ä»å®ä¼åè¿ä¸ªå°ååéget请æ±
app_private_key_path=r'C:\Users\Administrator\Desktop\pay\paypay\rsakey\private2048.txt', # åºç¨ç§é¥
alipay_public_key_path=r'C:\Users\Administrator\Desktop\pay\paypay\rsakey\paypublic.txt', # æ¯ä»å®å
¬é¥
debug=True,
)
body=request.body.decode('utf-8') # 转æå符串
post_data = parse_qs(body) # æ ¹æ®&符å·åå²
post_dict = {}
for k, v in post_data.items():
post_dict[k] = v[0]
sign = post_dict.pop('sign', None)
status = alipay.verify(post_dict, sign)
if status: # æ¯ä»æå
return HttpResponse('æ¯ä»æå')
else:
return HttpResponse('æ¯ä»å¤±è´¥')
else:
return HttpResponse('åªæ¯æPOST请æ±')
ä¸ãæ·»å è·¯ç±å½æ°å°urlè§åä¸
from django.urls import path
from . import views
urlpatterns=[
path('',views.index,name='index'),
path('dingdan/',views.dingdan,name='dingdan'),
path('show/',views.show,name='show'),
path('check/',views.check,name='check'),
]
å «ãè¿è¡é¡¹ç®
ææåå¤å·¥ä½é½å好äºï¼æä»¬èµ¶ç´§æ¥è¯çè¿è¡ä¸é¡¹ç®å§ï¼å¦ä¸ï¼
å¯ä»¥ç尿们è´ä¹°ååå龿¥æåè·³è½¬å°æ¯ä»çé¢ã
ä¹ãæ»ç»
该æ¯ä»å®æ¯ä»ç¯å¢å¨æ²ç®±ä¸å®ç°ï¼å æ¤å®å ¨æ§æ¯åº¸ç½®çï¼ä»£ç å°ç¼å·²ç»æå 好äºï¼ä¸è¿éé¢çappidè¿æå ¬ç§é¥éè¦å¤§å®¶èªè¡å¡«åå¢ã


























