Odoo17商城微信支付模块,快速一个实现可在线支付的商城
随着数字化时代的快速发展,支付方式的便捷性和安全性成为了商家和消费者共同关注的焦点。微信支付作为国内领先的支付平台,其APIv3的推出为商家提供了更加高效、安全的支付解决方案。本文将介绍如何在Odoo系统中集成微信支付APIv3,实现Native扫码支付、Jsapi微信浏览器内直接拉起支付,并发送下单及支付消息给管理员等功能。
模块特性
- 采用微信支付最新 API
- Native 扫码支付,商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。适用于PC网站、实体店单品或订单、媒体广告支付等场景。
- Jsapi 支付,在微信内打开网页时,可以调用微信支付完成下单支付的流程。
- 对接服务号,发送下单及支付消息给管理员(服务号需开通微信消息模板)
开通微信支付
- 注册微信支付商户号,获得 mchid
- 申请服务号或小程序并认证,获得 appid,由于微信支付的产品体系全部搭载于微信的社交体系之上,所以普通商户或服务商商户接入微信支付之前,都需要有一个微信社交载体,该载体(公众号、小程序)对应的 ID 即为 AppID。
- 绑定AppID 及 mchid, 登录微信商户平台,进入【产品中心 > AppID账号管理 】目录进行关联。
- 登录微信商户平台,进入【账户中心 > API安全 】目录,设置APIv3密钥,申请证书,获得证书序号。
微信支付流程
模块功能说明
安装、启用并测试微信支付模块 odooer_wechatpay
PC 浏览器中扫码支付
- 安装 odooer_wechatpay 模块 (需先安装相关 python 依赖包),并启用支付供应商
-
设置微信支付授权参数
-
商城中选择商品,确认订单并点击支付按钮
-
生成微信支付二维码
-
使用手机微信扫码支付,支付成功后自动跳转到支付成功页面
Jsapi 支付
-
在微信中打开商城链接,点击支付时,自动使用 jsapi 拉起微信支付控件,直接支付。
-
支付成功后自动跳转到支付成功页面
模块开发说明
确认订单创建交易
- 扩展支付供应商模块(payment.provider), 添加支付供应商的相关字段,包括商户号、API密钥等。这些信息将用于与微信支付平台进行通信。
- 打开付款页面 通过
_get_shop_payment_values()
获得数据渲染支付页面/shop/payment
- 根据选择的支付选项(微信支付),默认采用
redirect
支付流程, 点击提交按钮时前端 js 在_initiatePaymentFlow
中执行this.rpc('transaction_route': f'/shop/payment/transaction/{order.id}')
创建支付交易(payment.transaction), 并通过_get_specific_rendering_values()
的数据填充渲染redirect_form
返回到前端, 然后前端通过_processRedirectFlow()
挂载并提交表单。 - 这里使用了一个模板
<template id="redirect_form">
, 提交表单到自定义的/payment/wechatpay
路由,判断浏览器类型进一步选择 Native 或 Jsapi 支付。 - 若为微信浏览器则使用 Jsapi 支付,需用户授权获得 openid (使用
wechatpy
模块),否则使用 Native 支付。 - 支付交易(payment.transaction) 的订单号 tx.reference 作为 out_trade_no, 并获得订单金额 tx.amount, 通过
to_minor_currency_units
并转换金额为为分。 - 通过
order = request.website.sale_get_order()
获得订单商品信息。 - 使用 wechatpayv3 模块调用微信支付相关 API 下单生成支付数据(二维码、或 jsapi 参数)返回前端。
支付状态查询
- Native 扫码支付时:在二维码页面前端每隔5s刷新一次
/payment/wechatpay/status
, 主动通过微信订单查询接口查询状态是否为已支付,如果已支付则更新交易状态(payment.transaction),跳转到/payment/status
页面。 - Jsapi 支付时:前端通过 WeixinJSBridge 发起微信支付,返回支付成功则跳转到
/payment/status
页面。通过微信支付回调更新交易状态。 /payment/status
页面通过this.rpc('/payment/status/poll')
轮询交易(payment.transaction)状态- 如果已完成支付则调用
_finalize_post_processing
完成支付成功的后续处理, 跳转到支付成功页面。 - 支付回调处理,在 payment.transaction 中扩展下面俩个方法,并在回调 controller 中使用:
# 根据微信支付回调数据,查找 payment.transaction
def _get_tx_from_notification_data(self, provider_code, notification_data)
# 处理回调数据,支付成功或失败的处理, 通过 _handle_notification_data 调用
def _process_notification_data(self, notification_data)
订单信息推送
通过 wechatpy
模块集成微信服务号, 通过消息模板实现订单信息推送。
- 用户点击支付按钮时会发送订单信息给管理员。
- 用户支付成功后会发送支付信息给下单用户,可点击消息列链接看订单列表。
遇到的问题
-
安装 wechatpayv3 模块时,启动时报错:
has no attribute 'X509_V_FLAG_NOTIFY_POLICY
cryptography
和pyopenssl
两个模块不兼容导致- 解决方案:
pip install cryptography==38.0.4 pyopenssl==21.0.0
-
wechatpy
模块默认使用内存缓存,修改为使用cachetools
实现自定义多线程安全的缓存。 -
wechatpy
模块客户端中 api 接口实例化方式:
总结
通过集成微信支付APIv3,Odoo 系统实现了高效、安全的支付流程。Native扫码支付和Jsapi微信浏览器内直接拉起支付为用户提供了更加便捷的支付方式。同时,通过发送下单及支付消息给管理员,商家可以实时了解订单状态并进行相应处理。通过集成微信支付 结合 Odoo 系统内置的商城模块,可以为商家快速实现功能完善、高效的电商解决方案。