当前位置: 首页 > news >正文

微信公众号开发小记——5.python微信红包

描述

有时候产品有这么一些需求,当用户满足一定条件时,给他发一定金额的红包。

微信各个服务是独立的,比较蛋疼,要用红包功能,首先你需要注册一个微信商户平台账号。

代码位置 分支pay-20160802

微信支付比较烦,因为他有自己的加密方式,还要用证书,所以不能用之前sdk的东西,自己随便按照文档封了下加密以及api之类的算法,代码什么的很简单,跟着文档来好了。

一些需要介绍的东西

接入时最蛋疼的其实是刚入手不知道证书以及秘钥什么的有啥用,也没看到什么python的前辈仔细介绍过这些东西。

首先是微信证书,python用的是apiclient_cert.pem,与apiclient_key.pem这两个。

图片描述

其次是加密时用得api秘钥,文档

图片描述

代码讲解

配置

WEIXIN_PAY_CERT_FOLDER_PATH = 'cert_folder_path' # 证书文件夹路径
# 四个证书具体路径
WEIXIN_PAY_P12_CERT_PATH = 'apiclient_cert.p12_file_path'
WEIXIN_PAY_CERT_PATH = 'apiclient_cert.pem_file_path'
WEIXIN_PAY_CERT_KEY_PATH = 'apiclient_key.pem_file_path'
WEIXIN_PAY_CA_CERT_PATH = 'rootca.pem_file_path'
WEIXIN_PAY_API_KEY = '' # 微信商户平台api安全中设置的安全码
WEINXIN_PAY_MCH_ID = '' # 微信商户平台id

具体发红包的代码 pay.py

加密发红包没什么好说的,照着文档写就是了,就下面这一句,requests请求是可以带证书的,把微信要的证书给带上。

respose = requests.post(SENDREDPACK_URL, data=content, headers=headers,
            cert=(settings.WEIXIN_PAY_CERT_PATH, settings.WEIXIN_PAY_CERT_KEY_PATH))

models.py

血坑!!!解决方案请自行考虑

由于是血坑,我已经踩进去了,所以这里用一级标题标识。

并发啊,高并发啊,中国人知道发钱这种事情都是疯子啊,当你丢出一个发钱的链接后,就会有人用fiddler,charles之类的抓包然后干你,数据库太太太慢了,你一定要做好api的调用频次限制,而且这种活动上线后最好把跟主服务的几台机器分开,nginx只把这个活动的东西代过来,频次限制之类的一定要用redis之类的缓存,而且微信会面临红包的各种failed状况,无论微信那边成功失败与否,一次请求就是一次请求,频次限制无视微信那边的返回都要限(不要说用户体验不好,服务器炸了一天的飘过,当整个服务器炸了之后谁还管体验)。

写在最后

微信web开发者工具挺好用的,服务号里把自己加为开发者就能用了。

图片描述

一个nginx例子

例如,我已经有一个web服务,假设web的名字叫做 www.duoduo369.com,这时候80端口已经没了,但是我要接微信服务器,又没有另外的一台机器,这时候用nginx做一下就ok了,首先django加一个url,/weixin_server,创建一个二级域名例如weixin.duoduo369.com,然后nginx把weixin.duoduo369.com的所有请求代到 www.duoduo369.com/weixin_server即可。

upstream your-backend {
    server 127.0.0.1:8000 fail_timeout=0;
}

server {
  server_name weixin.yourdomain.com yourdomain.ittun.com;
  location / {
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://your-backend/weixin_server;
  }
}

相关文章:

  • Android 开发之布局细节对比:Gravity相关
  • 纯Html+Ajax和JSP两者对比的个人理解
  • LEAVE LIST-PROCESSING和LEAVE TO LIST-PROCESSING事件的作用
  • 开根号研究
  • CCIE学习笔记 ----BGP
  • 什么是内存泄漏
  • Log4Net使用指南 - sema - 博客园
  • CentOS运行级别和开机过程
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • jQuery效果-淡入淡出
  • AWSCLI安装及使用
  • iOS - AsyncSocket 的使用
  • 深入了解Java程序执行顺序
  • 4.ASCII码排序
  • 如何对system.img和userdata.img解包,再重新打包
  • 《深入 React 技术栈》
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • Bytom交易说明(账户管理模式)
  • Laravel 中的一个后期静态绑定
  • mysql_config not found
  • Netty 4.1 源代码学习:线程模型
  • Webpack 4 学习01(基础配置)
  • 高程读书笔记 第六章 面向对象程序设计
  • 关于 Cirru Editor 存储格式
  • 关于extract.autodesk.io的一些说明
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 聊一聊前端的监控
  • 怎样选择前端框架
  • MPAndroidChart 教程:Y轴 YAxis
  • (42)STM32——LCD显示屏实验笔记
  • (javascript)再说document.body.scrollTop的使用问题
  • (python)数据结构---字典
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (规划)24届春招和25届暑假实习路线准备规划
  • (十) 初识 Docker file
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (万字长文)Spring的核心知识尽揽其中
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)我也是一只IT小小鸟
  • (转)项目管理杂谈-我所期望的新人
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET关于 跳过SSL中遇到的问题
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • @ConditionalOnProperty注解使用说明
  • @Data注解的作用
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • @拔赤:Web前端开发十日谈
  • [ 转载 ] SharePoint 资料
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大
  • [AIGC] SQL中的数据添加和操作:数据类型介绍
  • [Android Pro] AndroidX重构和映射
  • [c++] 自写 MyString 类