yansongda / pay

可能是我用过的最优雅的 Alipay/WeChat/Douyin/Unipay/江苏银行 的支付 SDK 扩展包了
http://pay.yansongda.cn
MIT License
5.01k stars 1.03k forks source link

微信公众号支付服务商模式下出现错误 "请求中含有未在API文档中定义的参数“ #857

Closed andy236726493 closed 11 months ago

andy236726493 commented 11 months ago

包版本号

    "yansongda/hyperf-pay": "~1.5.0",
    "yansongda/pay": "~3.5.0",

问题描述

  1. 框架 Hyperf v3.0, 微信公众号下单,服务商模式,config 参数都检查了没错,下单参数也对的 下单时出错,显示 请求中含有未在API文档中定义的参数。日志中显示是,预下单失败:响应缺少 prepay_id 参数,{"code":"PARAM_ERROR","detail":{"location":null,"value":["/body/payer/openid"]}, 我看了openid 没有错 2 . $pay->wechat()->mp($params); 这样写,日志不会生成,$pay->wechat( array_merge($config, ['_force' => true]) )->mp( $params ); 加了'_force' 日志才生成。
    1. $pay->wechat($config )->mp($params), 这样写初始化 $config 不起作用,实际使用的 还是config/autoload/pay.php配置,要加 '_force',$pay->wechat( array_merge($config, ['_force' => true]) )->mp( $params ) ,$config才起作用。

你的代码

'wechat' => [
    'test' => [
        // 必填-商户号,服务商模式下为服务商商户号
        'mch_id' => '1575**03251',    //服务商
        // 选填-v2商户私钥
        'mch_secret_key_v2' => '',
        // 必填-商户秘钥
        'mch_secret_key' => 'be9ee1a1f7d2c053ee**efb9e13624038',   //服务商
        // 必填-商户私钥 字符串或路径
        'mch_secret_cert' =>  BASE_PATH . "/config/wechat/payconfig/service/apiclient_key.pem",   //服务商
        // 必填-商户公钥证书路径
        'mch_public_cert_path' => BASE_PATH . "/config/wechat/payconfig/service/apiclient_cert.pem",   //服务商
        // 必填
        'notify_url' =>  env('APP_URL') . "/api/wechat/pay/notify",
        // 选填-公众号 的 app_id
        'mp_app_id' => 'wxffc2add84**1c7676c8',  //服务商
        // 选填-小程序 的 app_id
        'mini_app_id' => '',
        // 选填-app 的 app_id
        'app_id' => '',
        // 选填-合单 app_id
        'combine_app_id' => '',
        // 选填-合单商户号
        'combine_mch_id' => '',
        // 选填-服务商模式下,子公众号 的 app_id
        'sub_mp_app_id' => '',
        // 选填-服务商模式下,子 app 的 app_id
        'sub_app_id' => '',
        // 选填-服务商模式下,子小程序 的 app_id
        'sub_mini_app_id' => '',
        // 选填-服务商模式下,子商户id
        'sub_mch_id' => '1635**30426',  //子商户
        // 选填-微信公钥证书路径, optional,强烈建议 php-fpm 模式下配置此参数
        'wechat_public_cert_path' => [
            '45F59D4DABF31918AFCEC556D5D2C6E376675D57' => '/www/wwwroot/cs.web.com/config/wechat/cert/wechatPublicKey.crt',
        ],
        // 选填-默认为正常模式。可选为: MODE_NORMAL, MODE_SERVICE
        'mode' => Pay::MODE_SERVICE,
    ],
],
'logger' => [
    'enable' => true,
    'file' => '/www/wwwroot/cs.web.com/public/uploadfile/log/loger.log', // 请注意权限
    'level' => 'debug', // 建议生产环境等级调整为 info,开发环境为 debug
    'type' => 'single', // optional, 可选 daily, daily 时将按时间自动划分文件.
    'max_file' => 30, // optional, 当 type 为 daily 时有效,默认 30 天
],

use Yansongda\HyperfPay\Pay; public function order(Pay $pay) { $out_trade_no = (string ) time(); $params = [ 'out_trade_no' => $out_trade_no, 'description' => 'subject-测试', 'settle_info' => ["profit_sharing"=> true], 'amount' => [ 'total' => 3, ], 'payer' => [ 'openid' => 'odvsB5xPYqmNIZ23rc-nvKbQTvZrt', ], ]; $pay = make(Pay::class); $result = $pay->wechat(array_merge($config, ['_force' => true]))->mp( params );

    $data       = [
        "out_trade_no"  => $out_trade_no,
        "merchant"      => "TEST",
        "bridgeConfig" => $result
    ];
    return $this->success("获取微信统一支付获取成功",$data );

}

报错详情

"请求中含有未在API文档中定义的参数“,日志中显示是 预下单失败:响应缺少 prepay_id 参数,{"code":"PARAM_ERROR","detail":{"location":null,"value":["/body/payer/openid"]}, 我看了openid 没有错

sdk 日志

2023-10-02T22:24:24.389586+08:00 > yansongda.pay.DEBUG > [wechat][InvokePrepayPlugin] 插件开始装载 {"rocket":{"Yansongda\Pay\Rocket":{"radar":{"url":"https://api.mch.weixin.qq.com/v3/pay/partner/transactions/jsapi","method":"POST","headers":{"Host":["api.mch.weixin.qq.com"],"Accept":["application/json, text/plain, application/x-gzip"],"User-Agent":["yansongda/pay-v3"],"Content-Type":["application/json; charset=utf-8"],"Authorization":["WECHATPAY2-SHA256-RSA2048 mchid=\"1575403221\",nonce_str=\"WgwqitF4outfCZER5M2eWtijgoOpjWjj\",timestamp=\"1696256663\",serial_no=\"1B3234D00260E34D9FF276A9190106EC9FFF2EB4\",signature=\"O/OIiL2s+GNNSkF9UfY6T8P9wNJHnyq2B7snpWGw1HlpYwF8Xcfs0tMrs5eSHoCs2BEaOXVI4fIcMAhZxOXKuRjH+aeAYzZcVw1RNDDfTm9NwTPeuYh0hcLKzf0Xo1WsaOvFGAKiAXoIA0iC2diL1UeCcWqsIekEoWbNkFKMsOKospMJ3v0v1BKMGAlSds+7D1eUjoAsiVwQAbqhNKtxEeTTRPI07onsqiWAczlp5V53y1aSvOPbfMGuKMaVv20SqD+kBRVCoZLSC0PIrVxg9U1GoOM7iOvCkMTAzGJNy1IqYpADIXECuqbETA25zcp7tRw6i5WuF2Xrn5hmryXVBQ==\""]},"body":"{\"out_trade_no\":\"1696256671\",\"description\":\"subject-测试\",\"settle_info\":{\"profit_sharing\":true},\"amount\":{\"total\":3},\"payer\":{\"openid\":\"odvsB5xPYqmNIZ2Yc-nvKbQTvZrc\"},\"sp_appid\":\"wxffc2add841c7676c8\",\"sp_mchid\":\"1575403251\",\"sub_mchid\":\"1635430426\",\"notify_url\":\"https:\/\/cs.xftedu.com\/api\/wechat\/pay\/notify\"}"},"params":{"out_trade_no":"1696256663","description":"subject-测试","settle_info":{"profit_sharing":true},"amount":{"total":3},"payer":{"openid":"odvsB5xPYqmNIZ2Yc-nvKytQTvZrt"}},"payload":{"out_trade_no":"1696256663","description":"subject-测试","settle_info":{"profit_sharing":true},"amount":{"total":3},"payer":{"openid":"odvsB5xPYqmNIZ2Yc-nvKbQTvZrc"},"sp_appid":"wxffc2add841c7676c8","sp_mchid":"1575403251","sub_mchid":"1635430426","notify_url":"https://cs.xftedu.com/api/wechat/pay/notify"},"packer":"Yansongda\\Pay\\Contract\\PackerInterface","direction":"Yansongda\\Pay\\Contract\\DirectionInterface","destination":{"code":"PARAM_ERROR","detail":{"location":null,"value":["/body/payer/openid"]},"message":"请求中含有未在API文档中定义的参数"},"destination_origin":{}}}}

2023-10-02T22:24:24.389946+08:00 > yansongda.pay.ERROR > [wechat][InvokePrepayPlugin] 预下单失败:响应缺少 prepay_id 参数,请自行检查参数是否符合微信要求 {"code":"PARAM_ERROR","detail":{"location":null,"value":["/body/payer/openid"]},"message":"请求中含有未在API文档中定义的参数"}

nginx/apache 日志

涉及到 异步通知、同步通知 的问题,请贴出来