python
根据经度纬度计算两点距离
from math import radians,cos,sin,asin,sqrt
#根据经纬度计算两点距离
def haversine(lon1,lat1,lon2,lat2):
"""
Calculate the great circle distance between two points
on the earth (specified in decimal degrees)
"""
# 将十进制度数转化为弧度
lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
# haversine公式
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat / 2) ** 2 + cos(lat1) * cos(lat2) * sin(dlon / 2) ** 2
c = 2 * asin(sqrt(a))
r = 6371 # 地球平均半径,单位为公里
return c * r * 1000
小数点保留位数
def get_two_float(f_str, n):
f_str = str(f_str) # f_str = '{}'.format(f_str) 也可以转换为字符串
a, b, c = f_str.partition('.')
c = (c+"0"*n)[:n] # 如论传入的函数有几位小数,在字符串后面都添加n为小数0
return ".".join([a, c])
base加时间戳加密
import re
import time
import base64
import random
# base64加密
def code_encryption(imei):
time_now = str(time.strftime('%Y.%m.%d %H:%M:%S', time.localtime(time.time())))
timei = time_now.split('.')
imei1 = imei[0:8]
imei2 = imei[8:]
num = random.randint(0, 100000)
name = imei1 + str(num) + timei[0] + imei2
name = name.encode('utf-8')
a = base64.b64encode(name)
return a
# base64解密
def code_decryption(str):
if re.match(r"[0-9]*$", str):
return str
b = base64.b64decode(str)
c = b.decode('utf-8')
i1 = c[0:8]
i2 = c[-8:]
_imei = i1 + i2
return _imei
十六进制数字转十进制字符串
import binascii
binascii.b2a_hex(data).decode()
微信获取用户openid
获取appid
import requests
# 获取用户openid
class OpenidUtils(object):
url = "https://api.weixin.qq.com/sns/jscode2session"
appid = "123456asdasd32132" # 乱写的
secret = "a81ef814642313fc22132465c3e02" # 同上
# self.jscode = jscode # 前端传回的动态jscode
def get_openid(self,jscode):
# url一定要拼接,不可用传参方式
url = self.url + "?appid=" + self.appid + "&secret=" + self.secret + "&js_code=" + jscode + "&grant_type=authorization_code"
r = requests.get(url)
openid = r.json()['openid']
return openid
云通讯发送短信接口
import random
from http import client
import urllib.parse
import json
import requests
url = 'http://smssh1.253.com/msg/send/'
un = '123121231'
pw = 123123123'
# 发送测试
TEST = False
def send_sms(phone, msg):
"""
能用接口发短信
"""
phone_number = phone
code = str(random.randint(100000, 999999))
if not TEST:
# msg = '【模板头】验证码 %s,如非本人操作,请检查您的 软件账号。' % code+
try:
msg = msg % code
except Exception as e:
msg = msg
rd = 1
data = {
'un': un,
'pw': pw,
'phone': phone_number,
'msg': msg,
'rd': rd
}
res = requests.get(url, params=data)
return code
django 微信小程序提现到零钱接口
微信支付开发文档
from __future__ import unicode_literals
import uuid
from django.conf import settings
from random import Random
import hashlib
import requests
import re
def get_client_ip(request):
"""
获取请求IP
:param request:
:return:
"""
ip = ''
try:
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ip = x_forwarded_for.split(',')[0]
else:
ip = request.META.get('REMOTE_ADDR')
except:
pass
return ip
def format_url(params, api_key=None):
"""
字典序排序
:param params:
:param api_key:
:return:
"""
url = "&".join(['%s=%s' % (key, params[key]) for key in sorted(params)])
if api_key:
url = '%s&key=%s' % (url, api_key)
return url
def calculate_sign(params, api_key):
"""
计算签名
:param params:
:param api_key:
:return:
"""
# 签名步骤一:按字典序排序参数, 在string后加入KEY
url = format_url(params, api_key)
# 签名步骤二:MD5加密, 所有字符转为大写
return hashlib.md5(url.encode('utf-8')).hexdigest().upper()
def random_str():
"""
生成32位随机字符串
:return:
"""
uuids = str(uuid.uuid1()).split('-')
uuidss = ''.join(uuids)
return uuidss
def dict_to_xml(params):
xml = ["<xml>", ]
for k, v in params.items():
xml.append('<%s>%s</%s>' % (k, v, k))
xml.append('</xml>')
return ''.join(xml)
def dict_to_xml2(params):
xml = ["<xml>", ]
for k, v in params.items():
xml.append('<%s><![CDATA[%s]]></%s>' % (k, v, k))
xml.append('</xml>')
return ''.join(xml)
def xml_to_dict(xml):
xml = xml.strip()
if xml[:5].upper() != "<XML>" and xml[-6:].upper() != "</XML>":
return None, None
result = {}
sign = None
content = ''.join(xml[5:-6].strip().split('\n'))
pattern = re.compile(r"<(?P<key>.+)>(?P<value>.+)</(?P=key)>")
m = pattern.match(content)
while m:
key = m.group("key").strip()
value = m.group("value").strip()
if value != "<![CDATA[]]>":
pattern_inner = re.compile(r"<!\[CDATA\[(?P<inner_val>.+)\]\]>")
inner_m = pattern_inner.match(value)
if inner_m:
value = inner_m.group("inner_val").strip()
if key == "sign":
sign = value
else:
result[key] = value
next_index = m.end("value") + len(key) + 3
if next_index >= len(content):
break
content = content[next_index:]
m = pattern.match(content)
return sign, result
class WeiXinPay(object):
def __init__(self, mch_appid, mchid, api_key):
self.api_key = api_key
self.url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers"
self.params = {
"mch_appid": mch_appid,
"mchid": mchid
}
def update_params(self, kwargs):
self.params["desc"] = "小程序提现" # 备注
self.params["check_name"] = "NO_CHECK"
self.params.update(kwargs)
def post_xml(self):
sign = calculate_sign(self.params, self.api_key)
self.params["sign"] = sign
xml = dict_to_xml(self.params)
# 要特别注意的是需要带证书(微信支付签发的)
response = requests.post(self.url, data=xml.encode('utf-8'),
cert=(settings.WXPAY_CLIENT_CERT_PATH, settings.WXPAY_CLIENT_KEY_PATH))
return xml_to_dict(response.text)
def post_xml2(self):
sign = calculate_sign(self.params, self.api_key)
self.params["sign"] = sign
xml = dict_to_xml2(self.params)
# 要特别注意的是需要带证书(微信支付签发的)
response = requests.post(self.url, data=xml.encode('utf-8'),
cert=(settings.WXPAY_CLIENT_CERT_PATH, settings.WXPAY_CLIENT_KEY_PATH))
return xml_to_dict(response.text)
class Pay(WeiXinPay):
def __init__(self, mch_appid, mchid, api_key):
super(Pay, self).__init__(mch_appid, mchid, api_key)
def post(self, openid, trade_no, amount, ip, name, nonce_str):
kwargs = {
"openid": openid,
"partner_trade_no": trade_no,
"amount": amount,
"spbill_create_ip": ip,
"re_user_name": name,
"nonce_str": nonce_str
}
self.update_params(kwargs)
return self.post_xml()[1]
class PayQuery(WeiXinPay):
"""
查询企业付款
"""
def __init__(self, mch_appid, mchid, api_key):
super(PayQuery, self).__init__(mch_appid, mchid, api_key)
self.url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo"
def post(self, trade_no, nonce_str):
kwargs = {
"partner_trade_no": trade_no,
"nonce_str": nonce_str
}
self.update_params(kwargs)
return self.post_xml2()[1]
def order_uuid():
# 订单号32位随机字符串
uuids = str(uuid.uuid1()).split('-')
uuidss = ''.join(uuids)
return uuidss
def wechat_pay(openid, amount, ip, name, nonce_str):
openid = openid
trade_no = order_uuid()
amount = amount # '企业付款金额,单位为分'
ip = ip
name = name # '收款用户姓名'
nonce_str = nonce_str #'随机字符串'
pay = Pay(settings.WXPAY_APPID, settings.WXPAY_MCHID, settings.WXPAY_APIKEY)
response = pay.post(openid, trade_no, int(float(amount) * 100), ip, name, nonce_str)
return response
settins.py
WXPAY_APPID = '123213123' # appid
WXPAY_MCHID = '123123123' # 商户号
WXPAY_APIKEY = '12312312412321' # api密钥
WXPAY_CLIENT_CERT_PATH = os.path.join(BASE_DIR, 'apiclient_cert.pem')
WXPAY_CLIENT_KEY_PATH = os.path.join(BASE_DIR, 'apiclient_key.pem')