django 调用微信接口(微信支付、微信用户信息)
来源:互联网 发布:如何查询测量数据 编辑:程序博客网 时间:2024/06/05 16:15
import hashlibimport randomimport stringimport urllibimport xml.etree.ElementTree as etimport timeimport requestsheaders = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36',}class WeChatConfig(object): appid = '微信appid' AppSecret = '微信AppSecret' mch_id = '微信商户id' api_key = '微信支付密钥'def get_access_token(): """ jssdk 刷新accesstoken的方法 微信基础接口所需的 accesstoken :param appid: :param secret:: :return: """ appid = WeChatConfig.appid secret = WeChatConfig.AppSecret url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' + \ appid + '&secret=' + secret html = requests.get(url, headers=headers).text m = eval(html) return mdef get_open_id_token(APPID, SECRET, CODE): """ 通过前端传的code 和 WeChatConfig中的基本信息 来获取用户的openid还有一个网页授权的accesstoken """ url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' + APPID + \ '&secret=' + SECRET + '&code=' + CODE + '&grant_type=authorization_code' html = requests.get(url, headers=headers) html_response = html.json() return html_responsedef get_user_info2(access_token, openid): """ 这个access_token是基础accessToken 通过 openid 和 基础接口的accesstoken 来获取用户信息 和下面的get_user_info不同的是 这个更加详细 :param access_token: :param openid: :return: 微信公众平台开发文档介绍:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140839 """ url = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token={0}&openid={1}&lang=zh_CN'.format(access_token, openid) html = requests.get(url, headers=headers) html.encoding = 'utf-8' html_response = html.json() return html_responsedef get_user_info(access_token, openid): """ 这个access_token是网页授权 获取用户信息 :param access_token: :param openid: :return: 微信公众平台开发文档介绍:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 """ url = 'https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN' % (access_token, openid) html = requests.get(url, headers=headers) html.encoding = 'utf-8' html_response = html.json() return html_responsedef get_ticket(access_token): """ :param access_token: 基础accesstoken :return: """ url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?' \ 'access_token=' + access_token + '&type=jsapi' html = requests.get(url, headers=headers).text m = eval(html) return mdef get_sign(ticket, url): """ 前端调用jssdk所需要的签名 """ return_dict = {} timestamp = int(time.time() * 1000) noncestr = ''.join(random.sample(string.ascii_letters + string.digits, 8)) sign = 'jsapi_ticket=' + ticket + '&noncestr=' + noncestr + '×tamp=' + str( timestamp) + '&url=' + url sha = hashlib.sha1(sign.encode('utf-8')) encrypts = sha.hexdigest() return_dict = {"timestamp": timestamp, "nonceStr": noncestr, "signature": encrypts, "appId": WeChatConfig.appid} return return_dictdef get_Package(body, notify_url, openid, spbill_create_ip, total_fee, out_trade_no, ): """ 前端调起微信H5支付所需要的参数 这里获取的是 prepay_id """ appid = WeChatConfig.appid mch_id = WeChatConfig.mch_id api_key = WeChatConfig.api_key nonce_str = ''.join(random.sample( string.ascii_letters + string.digits, 32)) # timeStamp = time.time() # out_trade_no = "{0}{1}".format(WeChatConfig.appid, int(timeStamp * 100)) stringA = "appid=" + appid + \ "&body=" + body + \ "&mch_id=" + mch_id + \ "&nonce_str=" + nonce_str + \ "¬ify_url=" + notify_url + \ "&openid=" + openid + \ "&out_trade_no=" + out_trade_no + \ "&spbill_create_ip=" + spbill_create_ip + \ "&total_fee=" + total_fee + \ "&trade_type=JSAPI" stringSignTemp = stringA + "&key=" + api_key # api-key未知 paySign = hashlib.md5(stringSignTemp.encode('utf-8')).hexdigest().upper() # print('paySign=', paySign) PayXml = "<xml>\ <appid>" + appid + "</appid>\ <body>" + body + "</body>\ <mch_id>" + mch_id + "</mch_id>\ <nonce_str>" + nonce_str + "</nonce_str>\ <notify_url>" + notify_url + "</notify_url>\ <openid>" + openid + "</openid>\ <out_trade_no>" + out_trade_no + "</out_trade_no>\ <spbill_create_ip>" + spbill_create_ip + "</spbill_create_ip>\ <total_fee>" + total_fee + "</total_fee>\ <trade_type>JSAPI</trade_type>\ <sign>" + paySign + "</sign>\ </xml>" req = urllib.request.Request( "https://api.mch.weixin.qq.com/pay/unifiedorder") req.add_header('User-Agent', 'Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25') unifiedorderXML = urllib.request.urlopen(req, data=PayXml.encode('utf-8')) tree = et.parse(unifiedorderXML) root = tree.getroot() # psign = root.find('sign').text prepay_id = root.find("prepay_id").text package = "prepay_id=" + prepay_id return packagedef get_PaySign(package): """ 将 要传给前端的数据全部打包发给前端 """ timestamp = int(time.time() * 1000) noncestr = ''.join(random.sample(string.ascii_letters + string.digits, 8)) stringB = "appId=" + WeChatConfig.appid + "&nonceStr=" + noncestr + "&package=" + package + "&signType=MD5&timeStamp=" + str( timestamp) stringBSignTemp = stringB + "&key={0}".format(WeChatConfig.api_key) paysign = hashlib.md5(stringBSignTemp.encode('utf-8')).hexdigest().upper() # 生成微信支付签名 Payment = {} Payment['timestamp'] = timestamp Payment['noncestr'] = noncestr Payment['paySign'] = paysign Payment['package'] = package return Payment
以上是调用微信接口相关
关于俩个accesstoken和俩个调用微信用户信息的接口大家可以看下这篇文章
微信获取用户信息的两个接口和两个ACCESS_TOKEN
关于微信支付 我也是通过前人的总结了解的 如下
python+h5微信支付总结
关于如何储存 基础accesstoken的方法
本人是通过数据库拉取有效期内的accesstoken
新建一张model
class AccessToken(models.Model): # access_token # 存放access_token # expires # 存放毫秒数 # update_time # 更新时间戳 access_token = models.CharField(max_length=255, null=True, blank=True, verbose_name='基础accessToken') expires = models.IntegerField(default=7200, verbose_name='可存放的时间') update_time = models.IntegerField(null=True, blank=True, verbose_name='更新时间') class Meta: verbose_name = '微信accesstoken记录表' verbose_name_plural = '微信accesstoken记录表' db_table = 'WCaccesstoken' def __str__(self): return self.access_token
如何验证 accesstoken是否有效
import time def send_accesstoken(): try: accesstoken = AccessToken.objects.get(id=1) update_time = accesstoken.update_time now_time = int(time.time()) if update_time < now_time: # 验证是否过期 M_accesstoken = get_access_token() access_token = M_accesstoken['access_token'] accesstoken.access_token = access_token _updatetime = int(time.time()) + 7200 # 更新过期时间 accesstoken.update_time = _updatetime accesstoken.save() return access_token else: return accesstoken.access_token except: M_accesstoken = get_access_token() access_token = M_accesstoken['access_token'] _accesstoken = AccessToken() _accesstoken.access_token = access_token _updatetime = int(time.time()) + 7200 _accesstoken.update_time = _updatetime _accesstoken.save() return access_token
阅读全文
0 0
- django 调用微信接口(微信支付、微信用户信息)
- 微信支付接口
- 微信支付接口
- 微信支付接口
- 前端调用微信支付接口
- Java调用微信支付接口完整版
- 微信支付配置信息,JSAPI接口,H5调用微信js接口支付,微信公众号支付
- 微信接口调用
- 微信接口调用
- php利用微信接口获取微信用户信息
- 申请微信支付接口
- 微信支付接口文档
- 微信支付接口bug
- 微信支付退款接口
- APP微信支付接口
- 微信支付接口开发
- 微信二维码支付接口
- 微信APP支付接口
- JAVA字节流与字符流的相互转换
- javax.swing
- 解决pip超时的问题
- 浅谈算法和数据结构: 四 快速排序
- .Net Web开发必备
- django 调用微信接口(微信支付、微信用户信息)
- android屏幕适配等问题
- 手把手教你写一个基于RxJava的扩展框架
- ftp命令结果提示“500 I won't open a connection to ...”
- response返回中文乱码
- JavaScript之Array类型
- 【转】data augmentation 数据增强方法总结
- SQL PRIMARY KEY
- 冲击百度seo首页需要两把刷子