def __init__(self): self.app_id = config.APPID self.app_secret = config.APP_SECRTET self.mch_id = config.MCH_ID self.mch_key = config.MCH_KEY # url处理 self.encodeURL = config.ENCODE_URL # self.URL = config.URL self.base_url = config.BASE_URL self.notify_url = config.WEIXIN_NOTIFY_URL # 初始化 self.wx_login = WeixinLogin(self.app_id, self.app_secret) self.wx_pay = WeixinPay(self.app_id, self.mch_id, self.mch_key, self.notify_url)
raw = dict( appid=self.app_id, partnerid=self.mch_id, prepayid=result['prepay_id'], noncestr=self.nonce_str, timestamp=timestamp, package='Sign=WXPay', ) raw['sign'] = self.sign(raw) return raw WeixinPay.app_order = app_order alipay = AliPay(**settings.ALIPAY) wechat_pay = WeixinPay(**settings.WECHAT_PAY) datetime_format = settings.REST_FRAMEWORK['DATETIME_FORMAT'] logger = logging.getLogger() class PayService: # 订单号规则:xxxx年xx月xx日xxxxx,案例:2018020500001。获取下单日期和当天的订单排序,从1开始,自然数 @classmethod def generate_out_trade_no(cls): return f"{datetime.now().strftime('%Y%m%d')}{get_order_no_serial()}" @classmethod def generate_name(cls, obj): if not isinstance(obj, User): return f'{obj.__class__._meta.verbose_name}' return '充值'
# -*- coding: utf-8 -*- from weixin import WeixinError from weixin.pay import WeixinPay from .config import WxConfig pay = WeixinPay(WxConfig.APPID, WxConfig.MCHID, WxConfig.KEY, WxConfig.SSLKEY_PATH, WxConfig.SSLCERT_PATH) def js_pay(openid, body, out_trade_no, fee, attach): try: raw = pay.jsapi(openid=openid, body=body, out_trade_no=out_trade_no, total_fee=fee, attach=attach) return raw except WeixinError as err: return str(err) payRoute = []
class WxPay(http.Controller): def __init__(self): self.app_id = config.APPID self.app_secret = config.APP_SECRTET self.mch_id = config.MCH_ID self.mch_key = config.MCH_KEY # url处理 self.encodeURL = config.ENCODE_URL # self.URL = config.URL self.base_url = config.BASE_URL self.notify_url = config.WEIXIN_NOTIFY_URL # 初始化 self.wx_login = WeixinLogin(self.app_id, self.app_secret) self.wx_pay = WeixinPay(self.app_id, self.mch_id, self.mch_key, self.notify_url) @http.route("/odoo/login/<param>", auth="public", website=True) def login(self, param, **kwargs): """ 微信获取code :param param: 传入参数名(非字典、列表) :return: """ redirect_url = self.base_url + param openid = request.httprequest.cookies.get("openid") next = request.httprequest.args.get("next") or redirect_url if openid: return request.redirect(next) # callback = url_for("authorized", next=next, _external=True) callback = self.encodeURL + "?next=" + next url = self.wx_login.authorize( callback, "snsapi_base") # 引导用户跳转到授权页面,callback = redirect_uri return request.redirect(url) @http.route("/odoo/authorized", auth="public", website=True) def authorized(self, **kwargs): """ 微信验证获取openid :return: """ code = request.httprequest.args.get("code") if not code: return "ERR_INVALID_CODE", 400 next = request.httprequest.args.get("next") data = self.wx_login.access_token(code) # 通过code换取网页授权access_token openid = data.openid resp = request.redirect(next) expires = datetime.now() + timedelta(days=1) resp.set_cookie("openid", openid, expires=expires) return resp @http.route("/odoo/pay/create", type="json", auth="public", website=True) def pay_create(self, **kwargs): """ 微信JSAPI创建统一订单,并且生成参数给JS调用 必填参数: out_trade_no 商户订单号 body 商品描述 total_fee 商品描述 openid 用户标识 """ # 网页端调起支付API try: remote_addr = request.httprequest.environ[ 'REMOTE_ADDR'] # 获取远程客户端IP openid = request.httprequest.cookies.get("openid") out_trade_no = self.wx_pay.nonce_str # 商户订单号设定为随机字符串 raw = self.wx_pay.jsapi(openid=openid, body=u"测试", out_trade_no=out_trade_no, total_fee=1, spbill_create_ip=remote_addr) # 外部传入openid return json.dumps(raw) # 直接返回包含Json格式数据响应的方法 except WeixinPayError as e: print(e.message) return e.message, 400 @http.route("/odoo/pay/notify", auth="public", website=True) def pay_notify(self, **kwargs): """ 微信异步通知 """ data = self.wx_pay.to_dict(request.data) if not self.wx_pay.check(data): return self.wx_pay.reply("签名验证失败", False) return self.wx_pay.reply("OK", True) # 处理业务逻辑
def get_raw_response(self): return Map( WeixinPay(None, None, None, None).to_dict( self.xml_response)) if self.xml_response else None
""" app_id = "wx7376a2b8c3146546" app_secret = "877c99113297bb5fd8e41e9e9b831dff" wx_login = WeixinLogin(app_id, app_secret) mch_id = "1534364961" mch_key = "wieuro9874297352sryoqiwUIUEUYwie" # url处理 encodeURL = "http%3A%2F%2Fwww.ai-solution.cn%2Fodoo%2Fauthorized" # 网站域名的encodeURLComponent URL = "http://www.ai-solution.cn/odoo/activity/" base_url = "http://www.ai-solution.cn/odoo" notify_url = base_url + "/wxpay/notify" # 异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数 # 初始化 wx_pay = WeixinPay(app_id, mch_id, mch_key, notify_url) class WxPay(http.Controller): @http.route("/odoo/login/<activity_name>", auth="public", website=True) def login(self, activity_name, **kwargs): """ 微信获取code :param activity_name: 活动名 :return: """ redirect_url = URL + activity_name openid = request.httprequest.cookies.get("openid") next = request.httprequest.args.get("next") or redirect_url if openid: return request.redirect(next)
def pay(self): url = reverse('weixin:pay_notify', args=[self.name]) full_url = '%s%s' % (settings.BASE_URL, url) pay = WeixinPay(self.app_id, self.mch_id, self.mch_key, full_url) return pay
from . import pay from .. import db from ..models import Order, User, Machine from flask import Flask, request, jsonify from weixin.pay import WeixinPay, WeixinPayError import time app = Flask(__name__) wx_pay = WeixinPay( '88888888', # app_id 公众号APP_ID。 '88888888', # mch_id 商户号。 '88888888', # mch_key 商户开发秘钥。 'http://pay.fm-ai.com/pay/notify', # notify_url 支付成功后回调地址。 ) @pay.route('/hello') def hello(): return 'Hello World!' @pay.route('/jsapi', methods=['POST']) def pay_jsapi(): """ 微信JSAPI创建统一订单,并且生成参数给JS调用 :return: 微信格式XML """ data_dict = wx_pay.to_dict(request.data.decode('utf-8')) product_id = data_dict['product_id'] m = Machine.query.get_or_404(int(product_id)) fee = m.fee
from datetime import datetime from weixin.pay import WeixinPay, WXAppPay APPID = 'wx1a66ade27075a7fc' MCHID = '1469243702' API_KEY = 'HSJUJJSH8281iwjsjkks8JKEEKKE8SPQ' wxpay = WeixinPay(appid=APPID, mch_id=MCHID, api_key=API_KEY, partner_key=API_KEY) press = int(100.19 * 100) print(press) create_pay_info = { 'body': '1ha2111i', # 商品描述 'out_trade_no': '28999919911999934496', # 商户订单号 'total_fee': press, # 标价金额 'spbill_create_ip': '133.125.12.123', # 终端IP 'notify_url': 'http://www.wei1xin.qq.com/wxpay/pay.php', # 通知地址 'trade_type': 'JSAPI', # 交易类型 'openid': 'oI-n80EBQTFeyjsR88EjtCoAkEkE' # 用户的open-id } if __name__ == '__main__': print('1')
def pay(self): url = reverse('weixin:pay_notify', args=[self.name]) full_url = 'http://%s%s' % (wx_conf.BIND_DOMAIN, url) pay = WeixinPay(self.app_id, self.mch_id, self.mch_key, full_url) return pay
# -*- coding: utf-8 -*- from weixin.helper import smart_bytes from weixin.pay import WeixinPay APPID = 'appid' MCH_ID = 'mchid' create_pay_info = { 'body': smart_bytes("这里写点啥呢?"), 'out_trade_no': '20181206130823938475', 'total_fee': 1, 'trade_type': "JSAPI", 'openid': 'ol9GscXefkyakBnRV4s', } wxpay = WeixinPay(APPID, MCH_ID, partner_key='partner key', notify_url='http://www.qq.com/pay/notify') order = wxpay.unifiedorder(**create_pay_info) print(order)