python实现银联支付和支付宝支付接入

  

本文实例为大家分享了python银联支付和支付宝支付接入的具体代码,供大家参考,具体内容如下

  

<强>前置条件:需要安装Python的OpenSSL模块,我使用的版本是16.1.0,可以使用pip安装pyopenssl来安装

  

<强>一、支付宝支付

  

1。使用RSA公钥加密系统进行签名和签名验证,需要自己生成一个RSA私钥和对应的一个RSA公钥(在Linux下可以使用ssh - keygen命令来生成),公钥需要上传至支付宝,供支付宝对开发者发送的请求做签名验证使用;而同时支付宝会提供一个RSA公钥给开发者,开发者使用这个公钥来验证支付宝的回调请求的合法性。

  

2。整个接入过程最核心的工作就是构建一个合法的请求报文,这个可以参考支付宝的相关文档;其次是对请求报文的内容进行RSA签名,并将签名随请求报文一并发送。

  

核心的签名和报文构建代码如下:

        进口OpenSSL   进口json   导入的时间   进口urllib   进口base64      django。配置导入设置      def build_sign (param_map sign_type=癛SA”):   “‘   医生:https://doc.open.alipay.com/doc2/detail.htm& # 63; treeId=200,正如=105351,docType=1   “‘   #将筛选的参数按照第一个字符的键值ASCII码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值ASCII码递增排序,以此类推。   sort_param=排序(((键,unicode(价值,settings.ALIPAY_CHARSET) .encode (settings.ALIPAY_CHARSET))为关键,价值param_map.iteritems()),关键=λx: x [0])   #将排序后的参数与其对应值,组合成“参数=参数值”的格式,并且把这些参数用,字符连接起来,此时生成的字符串为待签名字符串.SDK中已封装签名方法,开发者可直接调用,详见SDK说明。   #如自己开发,则需将待签名字符串和私钥放入SHA1 RSA算法中得出签名(标志)的值。   内容=',' . join (['=' . join (x)对x sort_param))   返回base64.encodestring (OpenSSL.crypto.sign(设置。ALIPAY_APP_PRIVATE_KEY_OBJ、内容的sha1))      def build_params (out_trade_no、主题、主体total_amount):   “‘   医生:https://doc.open.alipay.com/docs/doc.htm& # 63; spm=a219a.7629140.0.0.MVkRGo& treeId=193,正如=105465,docType=1   将参数按照支付宝规定组织并签名之后,返回   “‘   params={}   #获取配置文件   params [' app_id ']=settings.ALIPAY_APPID   params=settings.ALIPAY_METHOD(“法”)   params=settings.ALIPAY_FORMAT“格式”   params=settings.ALIPAY_CHARSET“字符集”   params [' sign_type ']=settings.ALIPAY_SIGN_TYPE   params [' sign_type ']=settings.ALIPAY_SIGN_TYPE   params[“时间戳”]=trftime (“% Y - % m - H % d %: % m: % S ')   params=settings.ALIPAY_VERSION“版本”   params [' notify_url ']=settings.ALIPAY_NOTIFY_URL      #业务参数   params [' biz_content ']={}   params [' biz_content ']['体']=身体#订单描述,订单详细,订单备注,显示在支付宝收银台里的“商品描述”里   params [' biz_content '](“主题”)=主题#商品的标题/交易标题/订单标题/订单关键字等。   params [' biz_content '] [' out_trade_no ']=out_trade_no #商户网站唯一订单号   params [' biz_content '] [' total_amount ']=' %。2 f ' %(浮动(total_amount)/100) #订单总金额,单位为元,精确到小数点后两位,取值范围(0.01,100000000)   params [' biz_content '] [' product_code ']=settings.ALIPAY_APP_PRODUCT_CODE   params [' biz_content ']=json。转储(params [' biz_content '],分隔符=(',',':'))      params[“标志”]=build_sign (params)      返回urllib.urlencode (params)      def check_sign(消息,标志):   ”医生:https://doc.open.alipay.com/docs/doc.htm& # 63; spm=a219a.7629140.0.0.dDRpeK& treeId=204,正如=105301,docType=1”   试一试:   OpenSSL.crypto.verify(设置。ALIPAY_PUBLIC_KEY_OBJ、标志、消息,“SHA1”)   还真   除了例外_:   返回False      

在读取支付宝公钥的时候,由于OpenSSL模块使用的是X509格式的证书,所以需要做以下的处理(用于对发起支付报文进行签名):

        #支付宝开发者公钥(支付宝生成)   ALIPAY_PUBLIC_KEY=os.path。加入(BASE_DIR,跑龙套/paycenter/支付宝/证书/alipay_public_key ')   _ALIPAY_PUBLIC_KEY_OBJ_PUB=OpenSSL.crypto.load_publickey (OpenSSL.crypto。FILETYPE_PEM、开放(ALIPAY_PUBLIC_KEY) .read ())   _ALIPAY_PUBLIC_KEY_OBJ_X509=OpenSSL.crypto.X509 ()   _ALIPAY_PUBLIC_KEY_OBJ_X509.set_pubkey (_ALIPAY_PUBLIC_KEY_OBJ_PUB)   ALIPAY_PUBLIC_KEY_OBJ=_ALIPAY_PUBLIC_KEY_OBJ_X509

python实现银联支付和支付宝支付接入