佳梦云付（jmyfpay）易支付宿主对接插件 v4.5
================================================

v4.5 变更（站内出码定稿）
  · submit.php 页面支付不再跳转平台收银台：改为跳转宿主自身扫码页
    /pay/qrcode/订单号/，由插件的 qrcode() 方法渲染平台收银台二维码，
    付款人扫码进入平台收银台支付，商户站全程不跳转收银台；
  · 扫码页刷新/重复进入触发平台「商户订单号重复」(-6)时，自动按商户单号
    回查平台原单并重建收银台二维码链接，不再报错；
  · 查单 query()：平台状态严格映射（1=已支付→1，其余待支付/已退款/已关闭/
    冻结/待核查→0），支付时间戳转日期字符串；
  · 代付 transfer()：失败态明确返回 code=-1，成功/处理中分别返回 status=1/0；
    代付携带 notify_url，新增 transfernotify() 接收平台 RSA2 签名的代付结果
    异步通知（验签后 processTransfer 落账，回 success 停止重试）；
  · 退款支持平台单号缺失时回退商户单号锚定；商品名/备注按平台长度上限截断；
  · mapi 明确拒绝付款码（scan）/jsapi/app/小程序等不支持的支付方式。

v4.4 变更
  · mapi 对接定稿：无论生产/沙盒，mapi.php 一律返回佳梦云付收银台二维码
    链接（qrcode 字段），由宿主渲染二维码，不跳转收银台；
  · 下单未返回支付数据时的错误提示更明确（检查应用密钥与运行模式配置）。

v4.3 变更
  · 通道配置保留「对接方式」select（仅作通道标识，两种入口均可用）；
  · 构造器 runmode 兼容宿主 select 序号存储（"1"=沙盒模式）。

v4.2 变更
  · submit 入口不再直接调平台下单后跳收银台。

v3.9 变更
  · 对齐宿主官方插件开发规范：info.json 配置项标注 required，补全
    bindwxmp/bindwxa 元数据。

v3.7/v3.8 变更
  · 接口返回 qrcode = 平台收银台地址（微信/支付宝内收银台）；
  · 查单响应补充 api_trade_no（渠道单号）与 buyer（支付账号原文）。

v3.0 变更
  · 仅 API 对接：全部下单走平台 /api/pay/create（平台已下线跳转式对接）。

v2.1 变更
  · 兼容 PHP 7.2+；接口请求自动跟随 http→https 跳转。

一、安装
  1. 解压本压缩包，得到 jmyfpay/ 文件夹（目录名 = info.json 的 name，宿主按目录扫描识别）。
  2. 将整个 jmyfpay/ 文件夹上传到宿主 plugins/payment/ 目录（属主 www:www）。
  3. 宿主后台「支付插件」中启用「佳梦云付」，并在通道配置中填写以下参数。

二、通道配置（双密钥，全部只保存在服务端）
  appurl           平台地址：佳梦云付站点地址，http(s):// 开头、/ 结尾。
  appid            应用APPID：佳梦云付商户中心「应用与密钥」创建的应用 ID。
  mch_private_key  商户私钥（textarea）：创建/重置应用时一次性下发的 RSA2 私钥
                   （PKCS#8 PEM，含 -----BEGIN PRIVATE KEY----- 头尾），用于对
                   下单/代付/查询/退款请求加签；平台不留存，遗失只能重置。
  plat_public_key  平台公钥（textarea）：佳梦云付平台公钥（SPKI PEM，含
                   -----BEGIN PUBLIC KEY----- 头尾，随应用创建/重置弹窗提供），
                   用于验签平台异步通知、同步回跳与代付通知。
  runmode          运行模式：生产/沙盒，必须与平台「应用设置」一致（不一致时
                   平台拒绝下单并明确提示改哪一侧）。
  connectmode      对接方式：仅作通道标识，两种入口均可用（mapi 返回二维码；
                   submit 站内扫码页）。

  旧版 v1.x 的「商户密钥 appkey（MD5）」与「是否使用 mapi 接口（appswitch）」均已废弃。

三、签名协议
  待签名串：参与签名的参数按参数名 ASCII 升序以 k=v& 拼接（跳过空值、sign、
  sign_type），出站请求用商户私钥做 RSA2（SHA256withRSA）签名，sign 取 base64，
  随参数携带 sign_type=RSA2 与 timestamp（±300 秒防重放）。
  异步通知/同步回跳/代付通知由佳梦云付平台私钥签名（RSA2），本插件用平台公钥验签。

四、支付（站内出码，不跳转收银台）
  pay_types 声明 alipay / wxpay（插件内映射为平台标准 wechat/alipay）。
  下单统一调平台 POST /api/pay/create（app_id + RSA2），返回 qrcode = 平台收银台
  地址，同时携带 pay_type=qrcode 与 pay_info=同一地址：
  · submit（页面支付）：跳宿主自身扫码页，展示收银台二维码，不跳转；
  · mapi（API 下单）：返回收银台二维码链接（qrcode 字段），宿主自行渲染。
  付款人用微信/支付宝扫码进入平台收银台，核验订单信息后完成支付。
  同一订单重复下单（页面刷新）自动回查原单重建二维码。

五、代付（转账）
  trans_types 声明 alipay / bank（平台另支持 wechat，插件已做映射）。
  transfer(array $bizParam)：入参 type、out_biz_no、money（元）、payee_account、
    payee_real_name、transfer_desc；调平台 POST /api/transfer/create；
    成功返回 {code:0,status:1,orderid,paydate}，处理中 {code:0,status:0,...}，
    失败 {code:-1,msg}。
  transfernotify()：接收平台代付结果异步通知（RSA2 验签，回 success）。
  transfer_query(array $bizParam)：入参 orderid（TF 开头平台单号）或 out_biz_no，
    调平台 POST /api/transfer/query，返回 {code,status(0/1/2),amount,paydate,errmsg}。

六、查单 / 退款
  query(order)：平台 /api/pay/query（app_id + RSA2），状态 1=已支付，其余映射 0。
  refund(order)：平台 POST /api/pay/refund；优先按平台单号（api_trade_no，JMY 开头）
    锚定，缺失时回退商户单号；money 缺省按可退全额退，支持部分退款。
  close(order)：平台订单 15 分钟未支付自动关闭，无主动关单接口，直接返回成功。

七、要求
  PHP 7.4+，openssl、curl 扩展。
