flask搭建微信支付和微信退款

#from _typeshed import NoneType
from flask import Flask
from flask import render_template
from flask import request
import hashlib
import requests
import json,time,string,random
import mysql.connector
from Crypto.Cipher import PKCS1_v1_5
from Crypto.PublicKey import RSA
from Crypto.Hash import SHA

import authorization


from werkzeug.datastructures import Authorization

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

#EncodingASEKey= "eyWcXtHNHbooXV3IRMYWG2z5XsbiHRWaVcQe5xXAbhN" 
if __name__ == '__main__':
   app.run(debug = True)

# wx.login 处理,获取 CODE --> openID, unionID. 

@app.route("/createOrder")
def createOrder():  #微信支付
   args = request.args
   print(args)
   # openid = olkGg5c4QBcPjag5PyLMZ1nIU9RE
   openid=request.args.get('openid')
   priceAmount = request.args.get('priceAmount')
   print(openid)
   # 小程序 APP ID 
   appid = ''
   # 小程序 app secret 
   appsecret = ''
   # 商户号 
   mchid = ''
   # 证书 序列号 
   serial_no = ''  
   timestamp = str(int(time.time())) 
   nonce_str=authorization.nonce_str()
   timetuple =  time.localtime()  
   time_string = time.strftime("%Y%m%d", timetuple)    
   # out_trade_no = time_string +openid[0:5]+ authorization.nonce_str(8)
   out_trade_no = request.args.get('out_trade_no')
   print(out_trade_no)
   payload = {
      "mchid": mchid,
      "out_trade_no": out_trade_no,
      "appid": appid,
      "description": "支付测试",
      "notify_url": "https://pay.qinghansoft.com/notify",
      "amount": {
         "total": int(priceAmount),
         "currency": "CNY"
      },
      "payer": {
         "openid": openid
      } 
   }
   # print(payload)
   # print(type(payload))
   body = json.dumps(payload)
   print(body)
   # print(type(body))
   # print(payload)
   print(json.dumps(payload))
   print("signature Started")
   # print(signature)
   print("signature Ended")

   # auth= authorization.GetAuthorization(mchid,nonce_str,signature,timestamp,serial_no) 
   # print(auth)
   # print(len(auth))



   # URL: https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi
   # 文档链接: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_1.shtml
   url = 'https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi'

   
   nonce_str=authorization.nonce_str()
   timestamp = str(int(time.time())) 

   signature=authorization.getSignature(method='POST',urlText='/v3/pay/transactions/jsapi',timestamp=timestamp,nonce=nonce_str,bodyText=body) 
   # signature=authorization.getSignature(method='GET',urlText='/v3/certificates',timestamp=timestamp,nonce=nonce_str,bodyText='') 

   print("signature Started")
   print(signature)
   print("signature Ended")   
   print(signature) 
   auth= authorization.GetAuthorization(mchid,nonce_str,signature,timestamp,serial_no) 
   print(auth)
   headers={
      'Content-Type':'application/json',
      'Accept': 'application/json',
      'Authorization': auth

   } 

 
   r = requests.post(url=url,data=body,headers=headers)
   print(r.json())
   # print(r.json())
   # resJSON= r.json()
   # prepay_id=resJSON['prepay_id']
   
   #GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
   
   responseJSON = r.json()
   prepay_id = responseJSON['prepay_id']

   data = getWxPaymentParam(prepay_id)
   return  data

@app.route("/cancelOrder")
def cancelOrder():  
   args = request.args
   print(args)
   # openid = olkGg5c4QBcPjag5PyLMZ1nIU9RE
   openid=request.args.get('openid')
   totalPrice=request.args.get('totalPrice')
   priceAmount =request.args.get('priceAmount')
   id =request.args.get('id')
   print(openid)


   # appid
   appid = ''

   # 小程序 app secret 
   appsecret = ''
   # 商户号 
   mchid = ''
   # 证书 序列号 
   serial_no =''

   # qh mchid
   # mchid = '1610574923'
   # qh serial_no
   # serial_no = '3947681FC5E9B7EBE8276712A2A77693F09190B5'
   timestamp = str(int(time.time())) 
   nonce_str=authorization.nonce_str()
   timetuple =  time.localtime()  
   time_string = time.strftime("%Y%m%d", timetuple)    
   # out_trade_no = time_string +openid[0:5]+ authorization.nonce_str(8)
   out_trade_no = request.args.get('out_trade_no')
   out_refund_no = time_string +openid[0:5]+ authorization.nonce_str(8)
   # out_refund_no = request.args.get('out_refund_no')
   print(out_trade_no)
   payload = {
      "out_trade_no": out_trade_no,
      "out_refund_no":out_refund_no,
      "notify_url": "https://pay.qinghansoft.com/notify",
      "amount": {
         "refund":int(priceAmount),
         "total": int(totalPrice),
         "currency": "CNY"
      },
   }
   # print(payload)
   # print(type(payload))
   body = json.dumps(payload)
   # print(body)
   # print(type(body))
   # print(payload)
   # print(json.dumps(payload))
   signature=authorization.getSignature(method='POST',urlText='/v3/refund/domestic/refunds',timestamp=timestamp,nonce=nonce_str,bodyText=body)
   # print("signature Started")
   # print(signature)
   # print("signature Ended")
   auth= authorization.GetAuthorization(mchid,nonce_str,signature,timestamp,serial_no)
   # print(auth)
   # print(len(auth))
   # URL: https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi
   # 文档链接: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_1.shtml
   url = 'https://api.mch.weixin.qq.com/v3/refund/domestic/refunds'
   headers ={
      'Content-Type':'application/json',
      'Accept': 'application/json',
      'Authorization': auth
      }
   r = requests.post(url=url,data=body,headers=headers)
   print(r.json())
   # print(r.json())
   # resJSON= r.json()
   # prepay_id=resJSON['prepay_id']
   
   #GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
   
   responseJSON = (r.json())
   # print(type(responseJSON))
   
   # prepay_id = responseJSON['prepay_id']

   # data = getWxPaymentParam(responseJSON)
   print(responseJSON['status'])
   return  responseJSON


@app.route("/checkCancel")
def checkCancel():  
   args = request.args
   print(args)
   # openid = olkGg5c4QBcPjag5PyLMZ1nIU9RE
   openid=request.args.get('openid')
   priceAmount = request.args.get('priceAmount')
   print(openid)  

   # 小程序 APP ID 
   appid = '' 
   # 小程序 app secret 
   appsecret = ''
   # 商户号 
   mchid = ''
   # 证书 序列号 
   serial_no = ''



   timestamp = str(int(time.time())) 
   nonce_str=authorization.nonce_str()
   timetuple =  time.localtime()  
   time_string = time.strftime("%Y%m%d", timetuple)    
   # out_trade_no = time_string +openid[0:5]+ authorization.nonce_str(8)
   out_trade_no = request.args.get('out_trade_no')
   out_refund_no = request.args.get('out_refund_no')
   
   # out_refund_no = request.args.get('out_refund_no')
   print(out_refund_no)
   url='/v3/refund/domestic/refunds/'+str(out_refund_no)
   url2 = 'https://api.mch.weixin.qq.com/v3/refund/domestic/refunds/'+str(out_refund_no)
   print(url2)
   
   # print(payload)
   # print(type(payload))
   
   # print(body)
   # print(type(body))
   # print(payload)
   # print(json.dumps(payload))
   signature=authorization.getSignature(method='GET',urlText=url,timestamp=timestamp,nonce=nonce_str,bodyText='')
   # print("signature Started")
   # print(signature)
   # print("signature Ended")

   auth= authorization.GetAuthorization(mchid,nonce_str,signature,timestamp,serial_no)

   print(auth)
   # print(auth)
   # print(len(auth))
  
   headers ={
      'Content-Type':'application/json',
      'Accept': 'application/json',
      'Authorization': auth
      }
   

   #查询单笔退款
   
   p = requests.get(url=url2,headers=headers)
   print(p.json())
   responseJSON = p.json()
   print(type(responseJSON))
   print(responseJSON['status'])
   
   return  responseJSON



@app.route("/getCertificate")
def getCertificate():  
   
   # 小程序 APP ID 
   appid = ''
   # 小程序 app secret 
   appsecret = ''
   # 商户号 
   mchid = ''
   # 证书 序列号 
   serial_no = ''
   payload = {
      
       }
   nonce_str=authorization.nonce_str()
   timestamp = str(int(time.time()))
   signature=authorization.getSignature(method='GET',urlText='/v3/certificates',timestamp=timestamp,nonce=nonce_str,bodyText='')
   print(signature)
   auth= authorization.GetAuthorization(mchid,nonce_str,signature,timestamp,serial_no)
   headers={
      'Content-Type':'application/json',
      'Accept': 'application/json',
      'Authorization': auth

   }
   r = requests.get('https://api.mch.weixin.qq.com/v3/certificates',headers=headers)

   
   #GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
   
   data = dict()
   # data = {
   #    "openid" : 'openid',
   #    "unionid": '',
   #    "session_key": 'session_key',
   # }

   print(r.json())
   print(r.text)
   return r.json()
   #return "Hello CheckSignature"


def getWxPaymentParam(prepay_id):
   print(prepay_id) 
   # xiang le appid 
   appid = ''   
   timestamp = str(int(time.time())) 
   nonce_str=authorization.nonce_str()
   package = 'prepay_id=' + str(prepay_id)
   paySign = authorization.getPaySign(appId=appid,timestamp=timestamp,nonce=nonce_str,bodyText=package)
   data = dict()
   data = {
      'nonceStr': nonce_str,
      'package': package,
      'paySign': paySign,
      'timeStamp': timestamp,
      'signType': 'RSA'
   }
   return data



@app.route("/getPrepayID")
def getPrepayID():     
   args = request.args
   print(args)
   # openid = olkGg5c4QBcPjag5PyLMZ1nIU9RE
   openid=request.args.get('openid')
   # eventID = request.args.get('eventID')
   print(openid)  

   # 支付参数 
   # appid = ''
   # appsecret = ''
   # mchid = ''
   # serial_no = '' 

   #支付参数   

   # 小程序 APP ID 
   appid = ''
   # 小程序 app secret 
   appsecret = ''
   # 商户号 
   mchid = ''
   # 证书 序列号 
   serial_no = ''


   timestamp = str(int(time.time())) 
   nonce_str=authorization.nonce_str()
   out_trade_no = request.args.get('out_trade_no')
   priceAmount = request.args.get('priceAmount') 
   #  实际付款时需要 X 100. 测试先用 1%金额。

   payload = {
      "mchid": mchid,
      "out_trade_no": out_trade_no,
      "appid": appid,
      "description": "支付测试",
      "notify_url": "https://pay.qinghansoft.com/notify",
      "amount": {
         "total": priceAmount,
         "currency": "CNY"
      },
      "payer": {
         "openid": openid
      } 
   }
   print(payload)
   print(type(payload))
   body = json.dumps(payload)
   print(body)
   print(type(body))
   # print(payload)
   # print(json.dumps(payload))
   signature=authorization.getSignature(method='POST',urlText='/v3/pay/transactions/jsapi',timestamp=timestamp,nonce=nonce_str,bodyText=body)
   print("signature Started")
   print(signature)
   print("signature Ended")

   auth= authorization.GetAuthorization(mchid,nonce_str,signature,timestamp,serial_no)
   print(auth)
   print(len(auth))
   # URL: https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi
   # 文档链接: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_1.shtml
   url = 'https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi'
   headers ={
      'Content-Type':'application/json',
      'Accept': 'application/json',
      'Authorization': auth
      }

   r = requests.post(url=url,data=body,headers=headers)
   print(r.json())
   # print(r.json())
   # resJSON= r.json()
   # prepay_id=resJSON['prepay_id']
   
   #GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
   
   responseJSON = r.json()
   prepay_id = responseJSON['prepay_id']

  

   return  responseJSON


@app.route("/notify", methods=('GET', 'POST'))
def notify():
   
   response = {
         
    "code": "SUCCESS",
    "message": "成功"

   }

   return json.dumps(response)

def get_cursor(cnx):
    cursor = cnx.cursor(buffered=True,dictionary=True)
    return cursor

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值