pythonはdjangoフレームを採用して、アリペイを支払ってすぐに帳簿のインターフェイスに着きます。


仕事のために、アリペイの支払いを検討しました。インターネットに接続して、過程を共有します。
即時に帳簿に着いてただ宝の多い商店のサービスの中の一つを支払うだけで、取引先がお金を支払うと表して、取引先は宝を支払ってお金を受け取った後に、すぐにあなたに知らせて、しかもこのお金は取引と関係を離れて、商店はすぐに使うことができます。
即時に帳簿に着いたら、企業の取引先にサービスを提供して、企業の口座番号を登録してから、契約書を申請してすぐに帳簿の製品に着きます。約3-5営業日後、契約が成功したら、すぐに統合製品の段階に入ることができます。
これはアリペイが提供するインターフェースです。asp、c萍、java、phpの四つの言語があります。それぞれの言語はGBKとUTF-8の二つのプログラムを提供します。もう一つのアリペイの文書を持っています。この文書は簡単なことを話せば話すほど面倒になります。
インターネットで検索したら、Pythonインターフェースにいくつかの既存のプログラムがあることが分かりました。
https://github.com/fengli/alipay_python
この二つは一つです。コードはまだ読んでいません。文書を書く時に見つけました。
https://github.com/lxneng/alipay
https://pypi.python.org/pypi/alipay/0.2.2
アリペイを支払うとすぐに帳簿取引過程に着きます。
商家:宝を支払う企業の取引先です。つまりあなたの統合サービス部門です。
端末消費者:ネットで買い物する消費者を指します。サービス単位の顧客を集めています。
1、端末消費者は商店のウェブサイトで商品を選択し、注文します。
2、事業者は支払情報をアリペイに指定されたリンクまでgetする。
3、端末消費者はアリペイを支払うウェブサイトで操作して支払う。
4、お支払いが成功したら、宝post決済成功の情報を商店に予め提供した住所に支払う。
5、アリペイを支払うと端末消費者が支払いに成功してから3秒後に、getを通じて商店が指定したリンクにジャンプします。
第4ステップは端末消費者操作による支払いのジャンプに関係なく、非同期通知と呼ばれています。このステップでは、アリペイはあなたが'success'に戻ることを期待しています。もしあなたが'success'に戻らないなら、宝を支払うと4分後に再度post決済が成功します。その後10分ごとにポストは一回、少なくとも30分以内にこのようにします。端末消費者の支払いが失敗すれば、非同期通知は発生しない。
統合を通じて、端末消費者の支払いが成功したら、3秒後にビジネスページに戻る理由が分かりました。非同期の知らせを待っている情報が先に到着して、先に注文書を処理して、端末消費者を連れてお客様のインタフェースに戻ります。そうすると、支払いの成功したページが見えます。もちろん支払いに失敗しました。非同期通知は発生しません。注文の状態は変わらないです。端末消費者は支払い失敗の情報を見るしかないです。
お支払いの過程が分かりました。設計プログラムを開始します。
1、商品の注文を生成します。端末消費者は商品を選んで注文を生成する。ID番号は唯一にしてください。これはUUIDを採用するのではなく、アリペイとの取引だけでいいです。1から増分してもいいです。端末消費者はこのIDを見ることができます。だから固定長の文字列を採用したほうがいいです。端末消費者は自分が最初のゲストであることを知っていたら、心の中が怖くなりますか?安全のためには、インクリメントだけでなく、少なくとも6ビットのランダムコード以上が必要であると後述する。
2、支払方法を選択する。私たちは即時着払いだけを集めていますので、アリペイで支払うしかありません。お支払い方法を注文情報に追加して、注文のID_postを次の住所にします。このステップのpostは新しいページを採用して、このページでダイアログを開きます。お客様自身で支払いの成功または支払いの失敗を選択させます。
3、支払情報を送信する。ポストからの注文番号の組み合わせ情報によって、get方式でデータをアリペイに送ります。端末消費者ページを動かしてアリペイ支払いページにジャンプします。
4、非同期の通知を受ける。
5、支払成功後にアリペイを支払ってジャンプして戻ってくるプログラム。戻ってきた時のget方式のため、端末消費者がより多くの敏感な情報を見ないようにするために、このステップはページをレンダリングするのではなく、情報を処理して、別のページにジャンプします。
6、支払結果を表示する。このページと第2ステップはお客様にクリックしてお支払いいただきます。支払いに失敗したら、説明に移りましょう。
alipay.py

import types 
from urllib import urlencode, urlopen 
from hashcompat import md5_constructor as md5<span style="white-space:pre">  </span># hashcompact.py 
from config import settings<span style="white-space:pre">     </span># config.py 
 
#         
def smart_str(s, encoding='utf-8', strings_only=False, errors='strict'): 
  if strings_only and isinstance(s, (types.NoneType, int)): 
    return s 
  if not isinstance(s, basestring): 
    try: 
      return str(s) 
    except UnicodeEncodeError: 
      if isinstance(s, Exception): 
        return ' '.join([smart_str(arg, encoding, strings_only, 
            errors) for arg in s]) 
      return unicode(s).encode(encoding, errors) 
  elif isinstance(s, unicode): 
    return s.encode(encoding, errors) 
  elif s and encoding != 'utf-8': 
    return s.decode('utf-8', errors).encode(encoding, errors) 
  else: 
    return s 
 
#      
_GATEWAY = 'https://mapi.alipay.com/gateway.do?' 
 
 
#                     
#          
def params_filter(params): 
  ks = params.keys() 
  ks.sort() 
  newparams = {} 
  prestr = '' 
  for k in ks: 
    v = params[k] 
    k = smart_str(k, settings.ALIPAY_INPUT_CHARSET) 
    if k not in ('sign','sign_type') and v != '': 
      newparams[k] = smart_str(v, settings.ALIPAY_INPUT_CHARSET) 
      prestr += '%s=%s&' % (k, newparams[k]) 
  prestr = prestr[:-1] 
  return newparams, prestr 
 
 
#        
def build_mysign(prestr, key, sign_type = 'MD5'): 
  if sign_type == 'MD5': 
    return md5(prestr + key).hexdigest() 
  return '' 
 
 
#          
def create_direct_pay_by_user(tn, subject, body, bank, total_fee): 
  params = {} 
  params['service']    = 'create_direct_pay_by_user' 
  params['payment_type'] = '1'    #    ,      
   
  #        
  params['partner']      = settings.ALIPAY_PARTNER 
  params['seller_id']     = settings.ALIPAY_PARTNER 
  params['seller_email']   = settings.ALIPAY_SELLER_EMAIL 
  params['return_url']    = settings.ALIPAY_RETURN_URL 
  params['notify_url']    = settings.ALIPAY_NOTIFY_URL 
  params['_input_charset']  = settings.ALIPAY_INPUT_CHARSET 
  params['show_url']     = settings.ALIPAY_SHOW_URL 
   
  #                  
  params['out_trade_no'] = tn    #                    
  params['subject']    = subject  #     ,           “    ” ,            “    ”    。 
  params['body']     = body   #     、    、    ,           “    ” ,     
  params['total_fee']   = total_fee #      ,           “    ” ,          
   
  #       ――     
  if bank=='alipay' or bank=='': 
    params['paymethod'] = 'directPay'  #     ,     :bankPay(  ); cartoon(  ); directPay(  ); CASH(    ) 
    params['defaultbank'] = ''     #      ,     
  else: 
    params['paymethod'] = 'bankPay'   #       ,     :bankPay(  ); cartoon(  ); directPay(  ); CASH(    ) 
    params['defaultbank'] = bank    #       ,     http://club.alipay.com/read.php?tid=8681379     
   
 
   
  params,prestr = params_filter(params) 
   
  params['sign'] = build_mysign(prestr, settings.ALIPAY_KEY, settings.ALIPAY_SIGN_TYPE) 
  params['sign_type'] = settings.ALIPAY_SIGN_TYPE 
   
  return _GATEWAY + urlencode(params) 
 
def notify_verify(post): 
  #     --   
  _,prestr = params_filter(post) 
  mysign = build_mysign(prestr, settings.ALIPAY_KEY, settings.ALIPAY_SIGN_TYPE) 
 
  if mysign != post.get('sign'): 
    return False 
   
  #     --                 
  params = {} 
  params['partner'] = settings.ALIPAY_PARTNER 
  params['notify_id'] = post.get('notify_id') 
 
  gateway = 'https://mapi.alipay.com/gateway.do?service=notify_verify&' 
  verify_result = urlopen(gateway, urlencode(params)).read() 
  if verify_result.lower().strip() == 'true': 
    return True 
  return False 
hashcompct.py

""" 
The md5 and sha modules are deprecated since Python 2.5, replaced by the 
hashlib module containing both hash algorithms. Here, we provide a common 
interface to the md5 and sha constructors, preferring the hashlib module when 
available. 
""" 
 
try: 
  import hashlib 
  md5_constructor = hashlib.md5 
  md5_hmac = md5_constructor 
  sha_constructor = hashlib.sha1 
  sha_hmac = sha_constructor 
except ImportError: 
  import md5 
  md5_constructor = md5.new 
  md5_hmac = md5 
  import sha 
  sha_constructor = sha.new 
  sha_hmac = sha 
config.py

#-*- coding:utf-8 -*- 
 
class settings: 
 #      ,         32    
 ALIPAY_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' 
 
 ALIPAY_INPUT_CHARSET = 'utf-8' 
 
 #      ID, 2088   16     
 ALIPAY_PARTNER = 'xxxxxxxxxxxxxxxx' 
 
 #                 
 ALIPAY_SELLER_EMAIL = '[email protected]' 
 
 ALIPAY_SIGN_TYPE = 'MD5' 
 
 #          (    )    http://       ,    ?id=123        
 ALIPAY_RETURN_URL='http://www.xxx.com/alipay/return/' 
 
 #                    http://       ,    ?id=123        
 ALIPAY_NOTIFY_URL='http://www.xxx.com/alipay/notify/' 
view.py

#     
def pay(request): 
  cbid=request.POST.get('id') 
  try: 
    cb=cBill.objects.get(id=cbid) 
  except ObjectDoesNotExist: 
    return HttpResponseRedirect("/err/no_object") 
   
  #         
  if cb.cbank.gateway=='alipay': 
      tn=cb.id 
      subject='' 
      body='' 
      bank=cb.cbank.id 
      tf='%.2f' % cb.amount 
      url=create_direct_pay_by_user (tn,subject,body,bank,tf) 
 
  #         
  elif cb.cbank.gateway=='tenpay': 
    pass 
   
  #      
  return HttpResponseRedirect (url) 
 
#alipay     
 
@csrf_exempt 
def alipay_notify_url (request): 
  if request.method == 'POST': 
    if notify_verify (request.POST): 
      #        
      tn = request.POST.get('out_trade_no') 
      #      
      trade_no=request.POST.get('trade_no') 
      #       
      trade_status = request.POST.get('trade_status') 
      cb = cBill.objects.get(pk=tn) 
       
      if trade_status == 'TRADE_SUCCESS': 
        cb.exe() 
        log=Log(operation='notify1_'+trade_status+'_'+trade_no) 
        log.save() 
        return HttpResponse("success") 
      else: 
        #     
        log=Log(operation='notify2_'+trade_status+'_'+trade_no) 
        log.save() 
        return HttpResponse ("success") 
    else: 
      #     
      log=Log(operation='hack_notify_'+trade_status+'_'+trade_no+'_'+'out_trade_no') 
      log.save() 
  return HttpResponse ("fail") 
 
#     
 
def alipay_return_url (request): 
  if notify_verify (request.GET): 
    tn = request.GET.get('out_trade_no') 
    trade_no = request.GET.get('trade_no') 
    trade_status = request.GET.get('trade_status') 
      
    cb = cBill.objects.get(pk=tn) 
    log=Log(operation='return_'+trade_status+'_'+trade_no) 
    log.save() 
    return HttpResponseRedirect ("/public/verify/"+tn) 
  else: 
    #         
    log=Log(operation='err_return_'+trade_status+'_'+trade_no) 
    log.save() 
    return HttpResponseRedirect ("/") 
 
 
#         session    ,       。 
#      xxx.com  ,         www.xxx.com,    ,session  。 
def verify(request,cbid): 
  try: 
    cb=cBill.objects.get(id=cbid) 
    #           1 ,       ! 
    #         
     
    return render_to_response('public_verify.html',{'cb':cb},RequestContext(request)) 
  except ObjectDoesNotExist: 
    return HttpResponseRedirect("/err/no_object") 
view.pyのコードは参考のみです。
以上が本文の全部です。皆さんの勉強に役に立ちたいです。