收藏
回答

预支付接口回文:输入源“/appid”映射到字段“公众号I (truncated...)是什么原因?

在调用“JSAPI下单”接口

/v3/pay/transactions/jsapi 时响应内容里提示:“输入源“/appid”映射到字段“公众号I (truncated...)”

我确认我填写的appid是小程序的不是公众号的,使用的是官方的wechatpay-apiv3/wechatpay-php sdk,核心代码如下:

    // 获取预支付id
    public static function orderInfo($p){
        $url = 'https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi';
        // $url = '/v3/pay/transactions/jsapi';
        $appId = Config::WxAppId;
        $mchId = Config::WxMchId;
        $mchName = Config::WxMchName;
        $serial_no = Config::WxPayCartNo;
        $orderNo = dechex(time()) . rand(1000, 9999);
        $notify_url = Config::Host . Config::BasePath . '/wechat/payNotify';
        $score = $p['score'];
        $openId = '我自己的openid';

        // 从本地文件中加载「商户API私钥」,「商户API私钥」会用来生成请求的签名
        $merchantPrivateKey = file_get_contents(SS_PLUGIN_APP_DIR.'/certs/apiclient_key.pem');
        $merchantPrivateKeyInstance = Rsa::from($merchantPrivateKey, Rsa::KEY_TYPE_PRIVATE);

        // 从本地文件中加载「微信支付平台证书」,用来验证微信支付应答的签名
        $platformCertificate = file_get_contents(SS_PLUGIN_APP_DIR.'/certs/apiclient_cert.pem');
        $platformPublicKeyInstance = Rsa::from($platformCertificate, Rsa::KEY_TYPE_PUBLIC);

        // 从「微信支付平台证书」中获取「证书序列号」
        $platformCertificateSerial = PemUtil::parseCertificateSerialNo($platformCertificate);

        // 构造一个 APIv3 客户端实例
        $instance = Builder::factory([
            'mchid'      => $mchId,
            'serial'     => $serial_no,
            'privateKey' => $merchantPrivateKeyInstance,
            'certs'      => [
                $platformCertificateSerial => $platformPublicKeyInstance,
            ],
        ]);        

        $data = array(
            "appid" => $appId,
            "mchid" => $mchId,
            "description" => "$mchName-积分充值-$score",
            "out_trade_no" => $orderNo,
            "time_expire" => time() + 600,
            "attach" => "自定义数据说明",
            "notify_url" => $notify_url,
            "amount" => array(
                "total" => $p['price'],
                "currency" => "CNY"
            ),
            "payer" => array(
                "openid" => $openId
            )
        );

        try{
            $rep = $instance->chain($url)->post($data)->getBody();
            return json_decode($rep);
        }catch(Exception $e){
            $code = $e->getCode();
            return array('code' => $code, 'rep' => $e->getMessage(), 'req' => $data);
        }
    }

// $e->getMessage():
'Client error: `POST https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi` resulted in a `400 Bad Request` response:\n{"code":"PARAM_ERROR","detail":{"location":null,"value":""},"message":"输入源“/appid”映射到字段“公众号I (truncated...)\n'

最后一次编辑于  06-03
回答关注问题邀请回答
收藏

4 个回答

  • Memory
    Memory
    06-02

    看起来是appid参数传的不对,打印日志看下请求参数,还有要打印完整报错出来看看

    06-02
    有用 1
    回复 12
    • 梁某某
      梁某某
      06-02
      appid没有问题,已补充参数截图
      06-02
      回复
    • Memory
      Memory
      06-02回复梁某某
      total错了
      06-02
      回复
    • 梁某某
      梁某某
      06-02回复Memory
      怎么错了?这是测试,值1  0.1 0.01元报错都一样
      06-02
      1
      回复
    • Memory
      Memory
      06-02回复梁某某
      微信支付金额为分,不过这个报错是在appid之后的,你的appid还是没传对
      06-02
      回复
    • 梁某某
      梁某某
      06-02回复Memory
      额,appid是从小程序后台粘贴到配置文件读出来的,截图也可以看到没有任何异常字符
      06-02
      回复
    查看更多(7)
  • 刘鹰扬
    刘鹰扬
    11-29

    总而言之,微信出错概率非常大,官方也没有明确说明,感觉就是可垃圾,弄得对接困难有啥意义

    11-29
    有用
    回复
  • AA等待
    AA等待
    11-29

    博主解决了吗 我也是这个问题

    11-29
    有用
    回复 1
  • 陈翠娣
    陈翠娣
    发表于移动端
    06-03
    中医讲课,听课后发红包。頁面上是給了,可刮不了微信,这是什么原因
    06-03
    有用
    回复
登录 后发表内容