• 主页

  • 投资

  • IT

    🔥
  • 设计

  • 销售

  • 共46篇

    python3.X - Web - Flask1.1.1

关闭

返回栏目

关闭

返回python3.X - Web - Flask1.1.1栏目

44 - Flask - 加上微信支付

作者:

贺及楼

成为作者

更新日期:2021-11-07 11:20:50

Flask - 加上微信支付

在Flask的init.py的create_app():加app.config 4个

  1. def create_app():
  2. #微信支付1.程序id: 2.商户号id 3.商户号钥匙 4.回调链接
  3. app.config['WEIXIN_APP_ID'] = ''
  4. app.config['WEIXIN_APP_MCH_ID'] =''
  5. app.config['WEIXIN_APP_MCH_KEY'] =''
  6. app.config['WEIXIN_NOTIFY_URL'] =''

加上2个JS

  1. <script src="js/jquery-3.3.1.js"></script>
  2. <script src="js/qrcode.min.js"></script>

html做一个按钮、二维码、关闭

  1. <div id="div1" style="text-align: center;width: 400px;height: 400px;;border-radius:10px;box-shadow: 4px 4px 18px #c3c3c3;">
  2. </br></br></br></br>
  3. <h1>500点</h1>
  4. </br></br>
  5. <button id="order1" class="button0" onclick="creat_order(this)" value="XXXXX">49元下单</button>
  6. </br></br>
  7. <div style="height: 200px;width: 200px;margin:0 auto"><div id="qrcode1"></div></div>
  8. </br>
  9. <img id="X1" onclick="close_order(this)" src="img/X.png" style="width: 50px;opacity:0">
  10. </div>

button点击onclick,creat_order(this)方法
button的value建议用一个自己知道的字符串
div qrcode1 准备二维码
img 点击onclick,close_order(this)方法关闭支付

JS的creat_order(this)方法

  1. var interval = '';
  2. //下单
  3. //点击微信支付按钮
  4. function creat_order(obj) {
  5. if ($(this).attr('disabled') == 'disabled') {
  6. return false;
  7. }
  8. var $box_btn = $(obj);//这个按钮
  9. var $idinfo = $box_btn.attr("id");//这个按钮的id
  10. var $valueinfo = $box_btn.attr("value");//这个按钮的value
  11. var $box = $box_btn.parent();//这个按钮的div
  12. var $box_X= $box.find("img");//X图片
  13. var $qrcodeDiv = $box.find("div").find("div");//qrcode标签div
  14. $.ajax({
  15. type: "POST",
  16. dataType: "json",
  17. url: "/cloud/weixinpay",
  18. data: {
  19. //表单信息
  20. bbox:$valueinfo
  21. },
  22. beforeSend: function () {
  23. $box_btn.text("正在生成支付二维码...请稍候");
  24. $box.animate({height: '550px'}, "slow");
  25. $box_X.animate({opacity: '1'}, "slow");
  26. },
  27. success: function (data) {
  28. if (data.status == "1") {
  29. //二维码
  30. var qrcode = new QRCode($qrcodeDiv[0],
  31. {text: data.qrcode, width: 200, height: 200});
  32. $box_btn.text("手机微信扫码支付");
  33. //轮询
  34. interval = window.setInterval(function () {
  35. pay_status(data.order_id)
  36. }, 3000);
  37. } else {
  38. //失败
  39. alert("系统错误停止操作");
  40. }
  41. }
  42. });
  43. return false;
  44. }

JS的pay_status()加上轮询

  1. //轮询
  2. function pay_status(order_id){
  3. $.ajax({
  4. type: "POST",
  5. dataType: "json",
  6. url: "/pay/weixinorder_status",
  7. //async:false,
  8. data:{order_id:order_id},
  9. success: function (data) {
  10. if (data.status=="已付款"){
  11. // 销毁定时任务
  12. window.clearInterval(interval);
  13. //关闭模态
  14. //$('#weixin-pay-model').modal('hide');
  15. $("#close-model").click();
  16. window.location.href = "/pudding";
  17. //跳转
  18. }
  19. else{
  20. console.log("失败,重新");
  21. }
  22. }
  23. });
  24. return false;
  25. };

JS的close_order(this)方法

  1. //停止按钮
  2. function close_order(obj) {
  3. var $box_img = $(obj);//X图片
  4. var $box = $box_img.parent();//大div
  5. $box.animate({height: '400px'}, "slow");
  6. $box_img.animate({opacity: '0'}, "slow");
  7. // 销毁定时任务
  8. window.clearInterval(interval);
  9. $('#qrcode1').empty();
  10. };

JS加上qrcode.min.js

Flask生成订单/cloud/weixinpay

  1. #微信支付
  2. #登录-多了个openid
  3. @wechat.route('/cloud/weixinpay', methods=['post'])
  4. def weixinpay():
  5. #判断有没有session
  6. if session.get('unionid') is not None:
  7. #判断有没有state
  8. if session.get('state') is not None:
  9. unionid = session.get('unionid')#从浏览器拿sessionunionid
  10. openid = session.get('openid')#从浏览器拿sessionopenid
  11. headimgurl = session.get('headimgurl') #从浏览器拿session拿headimgurl
  12. nickname = session.get('nickname')#从浏览器拿sessionnickname
  13. state = session.get('state')#从浏览器拿sessionstate
  14. session['unionid'] = unionid#设置session('unionid',unionid)
  15. session['nickname'] = nickname#设置session('nickname',nickname)
  16. session['headimgurl'] = headimgurl#设置session('headimgurl',headimgurl)
  17. session['state'] = state#设置session('state',state)
  18. session.permanent = True #开启session时间限制
  19. #上面是检验登陆
  20. #此处加逻辑
  21. ##################
  22. price = request.form.get('price')
  23. bbox = request.form.get('bbox')
  24. if bbox == "XXXXX":
  25. total_fee = 4900
  26. else:
  27. return "error"
  28. # 1.拿过数据后,进行出处理逻辑
  29. # 2.调用统一下单api,这四个参数都是必须的
  30. # 初始化
  31. pay = WeixinPay(app_id=app.config["WEIXIN_APP_ID"], mch_id=app.config["WEIXIN_APP_MCH_ID"],
  32. mch_key=app.config["WEIXIN_APP_MCH_KEY"], notify_url=app.config["WEIXIN_NOTIFY_URL"])
  33. out_trade_no = pay.nonce_str#生成订单号
  34. ip = request.remote_addr#获取ip地址
  35. Wechatdatabase_id = Wechatdatabase.query.filter_by(unionid=unionid).first().id
  36. order_name = total_fee/100
  37. order = Wechatdatabaseorder(openid=openid,nickname=nickname,unionid=unionid,out_trade_no=out_trade_no,order_name=order_name,state="未付款",time_end=0,total_fee=total_fee,spbill_create_ip=ip,Wechatdatabase_id=Wechatdatabase_id)
  38. db.session.add(order)
  39. db.session.commit()
  40. print(out_trade_no)
  41. try:
  42. # 统一支付api,trade_type:支付类型,当为native时,product_id参数必须要有,body为订单内容,out_rade_no:订单号,total_fee:费用,分为单位,attch:附加消息。
  43. # pay_info = pay.unified_order(trade_type="NATIVE", product_id=product_id, body="test", out_trade_no=out_trade_no,
  44. pay_info = pay.unified_order(trade_type="NATIVE", product_id=62, body="test", out_trade_no=out_trade_no,
  45. total_fee=total_fee,
  46. attach="other info ")
  47. except WeixinError as e:
  48. print(e)
  49. return make_response(jsonify({
  50. "status": 1,
  51. "info": pay_info, # 返回给ajax的订单信息,
  52. "qrcode": pay_info.code_url,
  53. "order_id": out_trade_no,
  54. }))
  55. else:
  56. return ('404')
  57. else:
  58. return redirect(url_for('wechat.login'))

Flask订单成功后微信会返回

  1. # 接受微信系统,支付成功回调的方法
  2. @wechat.route("/pay/notify", methods=["post", "get"])
  3. def pay_notify():
  4. """
  5. 微信异步通知
  6. """
  7. # 微信发过来的数据,xml格式
  8. data = request.data
  9. data = pay.to_dict(request.data.decode('utf-8'))
  10. pay = WeixinPay(app_id=app.config["WEIXIN_APP_ID"], mch_id=app.config["WEIXIN_APP_MCH_ID"],
  11. mch_key=app.config["WEIXIN_APP_MCH_KEY"], notify_url=app.config["WEIXIN_NOTIFY_URL"])
  12. if not pay.check(data):
  13. return pay.reply("签名验证失败", False)
  14. # 处理业务逻辑
  15. # 把数据写去Charge模型中去
  16. return pay.reply("OK", True)

Flask轮询

  1. #我查微信系统
  2. @wechat.route("/pay/weixinorder_status", methods=["POST"])
  3. def weixinorder_status():
  4. #判断有没有session
  5. if session.get('unionid') is not None:
  6. #判断有没有state
  7. if session.get('state') is not None:
  8. #从浏览器拿session拿unionid
  9. unionid = session.get('unionid')#从浏览器拿sessionunionid
  10. headimgurl = session.get('headimgurl')#从浏览器拿sessionheadimgurl
  11. nickname = session.get('nickname')#从浏览器拿sessionnickname
  12. state = session.get('state')#从浏览器拿sessionstate
  13. session['unionid'] = unionid#设置session('unionid',unionid)
  14. session['nickname'] = nickname #设置session('nickname',nickname)
  15. session['headimgurl'] = headimgurl#设置session('headimgurl',headimgurl)
  16. session['state'] = state#设置session('state',state)
  17. session.permanent = True#开启session时间限制
  18. #上面是检验登陆
  19. #此处加逻辑
  20. ##################
  21. if request.method == 'POST':
  22. # 查询订单
  23. pay = WeixinPay(app_id=app.config["WEIXIN_APP_ID"], mch_id=app.config["WEIXIN_APP_MCH_ID"],
  24. mch_key=app.config["WEIXIN_APP_MCH_KEY"], notify_url=app.config["WEIXIN_NOTIFY_URL"])
  25. order_id = request.form.get('order_id')
  26. try:
  27. query_info = pay.order_query(out_trade_no=order_id)
  28. print("查询信息", query_info)
  29. if query_info["result_code"] == "SUCCESS" and query_info["return_code"] == "SUCCESS":
  30. print("支付状态", query_info["trade_state"])
  31. if query_info["trade_state"] == "SUCCESS":
  32. print("支付成功")
  33. #更新订单数据
  34. out_trade_no = query_info.get("out_trade_no")#微信-订单号
  35. time_end = query_info.get("time_end")#微信-支付完成时间
  36. order = Wechatdatabaseorder.query.filter_by(out_trade_no=out_trade_no).first()#根据订单号查记录
  37. order.state = "已付款" #修改数据
  38. order.time_end = time_end #修改支付完成时间
  39. #更新用户数据
  40. total_fee = int(query_info.get("total_fee"))
  41. #自己写
  42. #增加点数
  43. if total_fee == 4900:
  44. add_points = 500
  45. else:
  46. return "error"
  47. #自己写啦
  48. #提交操作到数据库
  49. db.session.commit()
  50. #返回订单状态status=1
  51. status = str(Wechatdatabaseorder.query.filter_by(out_trade_no=out_trade_no).first().state)
  52. data = {"status": status}
  53. return jsonify(data)
  54. except WeixinError as e:
  55. print(e)
  56. else:
  57. return ('404')
  58. else:
  59. return redirect(url_for('wechat.login'))