对接支付宝支付接口(Django)

因为python没有集成支付宝的sdk,安装第三方的包 python-alipay-sdk 1.79

链接python-alipay-sdk 1.7.0

[python]  view plain  copy
  1. pip install  python-alipay-sdk==1.79  

具体操作参考

http://https://github.com/fzlee/alipay

实现过程

生成自己的公钥和私钥

[html]  view plain  copy
  1. openssl  
  2. OpenSSL> genrsa -out app_private_key.pem   2048  # 私钥  
  3. OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem # 导出公钥  
  4. OpenSSL> exit  

在支付宝上下载的公钥是一个字符串,你需要在文本的首尾添加标记位 (-----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----) 才能正常使用 证书的格式你可以参考这里

[python]  view plain  copy
  1. views.py  
  2.   
  3. from alipay import AliPay  
  4. from django.conf import settings  
  5.   
  6.   
  7. notify_url = "https://xxxxx:8003/api/aliapy_back_url/" # 支付成功回掉的地址,在支付宝中设置  
  8. @csrf_exempt  
  9. def ali():  
  10.     # 设置自己的私钥,将自己的公钥放在支付宝上  
  11.     merchant_private_key_path = settings.BASE_DIR + '/live_api/static/keys/pri/pri.pem' #设置公钥和私钥的地址,文件上下两行begin和end是必须的,公钥就放在第二行。  
  12.     #设置支付宝公钥,我用的是sha1加密方式的pem文件  
  13.     alipay_public_key_path = settings.BASE_DIR + '/live_api/static/keys/pub/pub.pem'  
  14.     app_private_key_string = open(merchant_private_key_path).read()  
  15.     alipay_public_key_string = open(alipay_public_key_path).read()  
  16.     app_id = "" #复制来自支付宝生成的id  
  17.   
  18.     alipay = AliPay(  
  19.         appid=app_id,  
  20.         app_notify_url=notify_url,  # 默认回调url  
  21.         app_private_key_string=app_private_key_string,  
  22.         alipay_public_key_string=alipay_public_key_string,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,  
  23.         sign_type="RSA",  # RSA 或者 RSA2   
  24.         debug = False  # 默认False  
  25.     )  
  26.     return alipay  
  27.   
  28. 充值生成订单  
  29. @csrf_exempt  
  30. def recharge(request):  
  31.     alipay = ali()  
  32.     ret = {  
  33.         'code'200,  
  34.             'msg''请求成功!'  
  35.         'order_string'  
  36.     }  
  37.     try:  
  38.         info = INFO(request)  
  39.         info.checkPostEmpty('user_id''money')  
  40.     user_id = request.POST.get('user_id')  
  41.     money = request.POST.get( 'money')  
  42.     # 生成订单  
  43.         order_string = alipay.api_alipay_trade_app_pay(  
  44.                 out_trade_no="LB" + str(int(round(time.time()))),  # 商户订单号  
  45.                 total_amount=money,  
  46.                 subject="liuhuabi",  # 商品简单描述  
  47.                 notify_url=notify_url # 可选, 不填则使用默认notify url  
  48.             )  
  49.   
  50.         ret.code = 200  
  51.         print order_string  
  52.         ret.order_string = order_string  
  53.         ret.msg = "请求成功!"  
  54.     except Exception, e:  
  55.         ret.code = 1010  
  56.         ret.msg = str(e)  
  57.         print(str(e))  
  58.     return HttpResponse(ret.toJson()) 返回订单的生成的订单码  
  59.  
  60.  
  61.  
  62. @csrf_exempt  
  63. def aliapy_back_url(request):  
  64.     alipay = ali()  
  65.     if request.method == "POST":  
  66.         # 检测是否支付成功  
  67.         # 去请求体中获取所有返回的数据:状态/订单号  
  68.         from urllib import parse_qs  
  69.   
  70.         # request.body                  => 字节类型  
  71.         # request.body.decode('utf-8')  => 字符串类型  
  72.         """ 
  73.         {"k1":["v1"],"k2":["v1"]} 
  74.         k1=[v1]&k2=[v2] 
  75.         """  
  76.         body_str = request.body.decode('utf-8')  
  77.         post_data = parse_qs(body_str)  
  78.         # {k1:[v1,],k2:[v2,]}  
  79.   
  80.         # {k1:v1}  
  81.         post_dict = {}  
  82.         for k, v in post_data.items():  
  83.             post_dict[k] = v[0]  
  84.   
  85.   
  86.         print(post_dict)  
  87.         """ 
  88.         {'gmt_create': '2017-11-24 14:53:41', 'charset': 'utf-8', 'gmt_payment': '2017-11-24 14:53:48', 'notify_time': '2017-11-24 14:57:05', 'subject': '充气式韩红', 'sign': 'YwkPI9BObXZyhq4LM8//MixPdsVDcZu4BGPjB0qnq2zQj0SutGVU0guneuONfBoTsj4XUMRlQsPTHvETerjvrudGdsFoA9ZxIp/FsZDNgqn9i20IPaNTXOtQGhy5QUetMO11Lo10lnK15VYhraHkQTohho2R4q2U6xR/N4SB1OovKlUQ5arbiknUxR+3cXmRi090db9aWSq4+wLuqhpVOhnDTY83yKD9Ky8KDC9dQDgh4p0Ut6c+PpD2sbabooJBrDnOHqmE02TIRiipULVrRcAAtB72NBgVBebd4VTtxSZTxGvlnS/VCRbpN8lSr5p1Ou72I2nFhfrCuqmGRILwqw==', 'buyer_id': '2088102174924590', 'invoice_amount': '666.00', 'version': '1.0', 'notify_id': '11aab5323df78d1b3dba3e5aaf7636dkjy', 'fund_bill_list': '[{"amount":"666.00","fundChannel":"ALIPAYACCOUNT"}]', 'notify_type': 'trade_status_sync', 'out_trade_no': 'x21511506412.4733646', 'total_amount': '666.00', 'trade_status': 'TRADE_SUCCESS', 'trade_no': '2017112421001004590200343962', 'auth_app_id': '2016082500309412', 'receipt_amount': '666.00', 'point_amount': '0.00', 'app_id': '2016082500309412', 'buyer_pay_amount': '666.00', 'sign_type': 'RSA2', 'seller_id': '2088102172939262'} 
  89.         {'stade_status': "trade_success",'order':'x2123123123123'} 
  90.         """  
  91.         sign = post_dict.pop('sign'None)  
  92.   
  93.         status = alipay.verify(post_dict, sign)  
  94.         if status:  
  95.             print(post_dict['stade_status'])  
  96.             print(post_dict['out_trade_no'])  
  97.   
  98.         # return HttpResponse('POST返回')  
  99.     else:  
  100.         # QueryDict = {'k':[1],'k1':[11,22,3]}  
  101.         params = request.GET.dict()  
  102.         sign = params.pop('sign'None)  
  103.         status = alipay.verify(params, sign)  
  104.         print('GET验证', status)  
  105.         # return HttpResponse('支付成功')  
[python]  view plain  copy
  1. url  
  2.     url(r"^alipay/", recharge),  
  3.     url(r"^aliapy_back_url/", aliapy_back_url),  


猜你喜欢

转载自blog.csdn.net/hanyuyang19940104/article/details/80283651