ExWechatpay.VirtualPay (ex_wechatpay v0.4.0)

View Source

虚拟支付主入口模块

提供微信虚拟支付的完整 API:

  • sign: 生成支付签名(组装 signData + 计算所有签名)
  • query_balance: 查询代币余额
  • query_order: 查询订单状态
  • refund: 发起退款
  • notify_deliver: 通知发货
  • code2session: 用 code 换 session_key + openid

此模块是 VirtualPay 子系统的门面,内部委托给 Client/Signature/Callback 等子模块。

Summary

Functions

code2session(config, code)

@spec code2session(
  keyword(),
  String.t()
) :: {:ok, map()} | {:error, ExWechatpay.Exception.t()}

用 code 换 session_key + openid

notify_deliver(config, openid, out_trade_no)

@spec notify_deliver(keyword(), String.t(), String.t()) ::
  {:ok, map()} | {:error, ExWechatpay.Exception.t()}

通知发货

query_balance(config, openid, user_ip)

@spec query_balance(keyword(), String.t(), String.t()) ::
  {:ok, map()} | {:error, ExWechatpay.Exception.t()}

查询代币余额

query_order(config, openid, out_trade_no)

@spec query_order(keyword(), String.t(), String.t()) ::
  {:ok, map()} | {:error, ExWechatpay.Exception.t()}

查询订单状态

refund(config, openid, out_trade_no, refund_fee)

@spec refund(keyword(), String.t(), String.t(), integer()) ::
  {:ok, map()} | {:error, ExWechatpay.Exception.t()}

发起退款

sign(config, args)

@spec sign(keyword(), keyword()) :: {:ok, map()} | {:error, ExWechatpay.Exception.t()}

生成支付签名

组装 signData 并计算所有签名,返回前端 wx.requestVirtualPayment 所需的全部数据。

参数

  • config - 配置(包含 appid, secret, virtual_pay 子键)
  • args - 参数
    • :product_id - 道具 ID,如 "vip_six_week"
    • :out_trade_no - 商户订单号
    • :code - wx.login() 获取的 code
    • :goods_price - 价格(分)
    • :buy_quantity - 购买数量(默认 1)
    • :attach - 自定义透传字段(默认 "ex_wechatpay")

返回值

  • {:ok, map()} - 成功,包含 sign_data, sign_data_str, pay_sig, signature, session_key, openid
  • {:error, Exception.t()} - 失败

重要

  • sign_data_str 必须原样传给前端,前端不能再 JSON.stringify
  • pay_sig 已包含 "requestVirtualPayment&" 前缀