收藏
回答

获取微信支付二维码链接时,调用接口提示 400

提示错误:
[400] ClientException in RequestException.php line 113
Client error: `POST https://api.mch.weixin.qq.com/v3/pay/transactions/native` resulted in a `400 Bad Request` response

一下是请求参数:
$resp = $client->request(
    'POST',
    'https://api.mch.weixin.qq.com/v3/pay/transactions/native', //请求URL
    [
        // JSON请求体
        'json' => [
            "time_expire" => "2018-06-08T10:34:56+08:00",
            "amount" => [
                "total" => 100,
                "currency" => "CNY",
            ],
            "mchid" => "1230000109",
            "description" => "Image形象店-深圳腾大-QQ公仔",
            "notify_url" => "https://www.weixin.qq.com/wxpay/pay.php",
            "out_trade_no" => "1217752501201407033233368018",
            "goods_tag" => "WXG",
            "appid" => "wxd678efh567hg6787",
            "attach" => "自定义数据说明",
            "detail" => [
                "invoice_id" => "wx123",
                "goods_detail" => [
                    [
                        "goods_name" => "iPhoneX 256G",
                        "wechatpay_goods_id" => "1001",
                        "quantity" => 1,
                        "merchant_goods_id" => "商品编码",
                        "unit_price" => 828800,
                    ],
                    [
                        "goods_name" => "iPhoneX 256G",
                        "wechatpay_goods_id" => "1001",
                        "quantity" => 1,
                        "merchant_goods_id" => "商品编码",
                        "unit_price" => 828800,
                    ],
                ],
                "cost_price" => 608800,
            ],
            "scene_info" => [
                "store_info" => [
                    "address" => "广东省深圳市南山区科技中一道10000号",
                    "area_code" => "440305",
                    "name" => "腾讯大厦分店",
                    "id" => "0001",
                ],
                "device_id" => "013467007045764",
                "payer_client_ip" => "14.23.150.211",
            ]
        ],
        'headers' => [ 'Accept' => 'application/json' ]
    ]


回答关注问题邀请回答
收藏

4 个回答

  • 阔水连天
    阔水连天
    2022-01-18

    你的接口,是否真的正确?正常情况下,你把接口直接写在网页中,是有返回值的。我用的接口是:https://api.mch.weixin.qq.com/pay/unifiedorder

    这个是我调用支付时用的接口,直接在网页中调用显示如下 :

    使用你的接口(https://api.mch.weixin.qq.com/v3/pay/transactions/native)
    

    显示如下:

    2022-01-18
    有用 1
    回复 7
    • 宗明星
      宗明星
      2022-01-18
      我也不清楚为什么接口时显示成那样,但接口地址就是那个啊。这是接口的地址:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_1.shtml
      2022-01-18
      回复
    • 阔水连天
      阔水连天
      2022-01-18回复宗明星
      具体提示我不好说什么。但是,你提供的josn格式不对呀:你的格式是数组格式呀。json格式是{},如:
      2022-01-18
      1
      回复
    • 宗明星
      宗明星
      2022-01-18回复阔水连天
      这也是官方文档里面提供的方法,那你是怎么请求接口的?
      2022-01-18
      回复
    • 阔水连天
      阔水连天
      2022-01-18回复宗明星
      我们的用法不完全一样。我是JSAPI支付。贴出来部分代码,如果你觉得可能有用,我把文件发给你。


      其中,http_request函数代码如下:

       //curl请求
       public function http_request($url,$data = null,$headers=array())
       {
        $curl = curl_init();
        if( count($headers) >= 1 ){
         curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        }
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        if (!empty($data)){
         curl_setopt($curl, CURLOPT_POST, 1);
         curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($curl);
        curl_close($curl);
        return $output;
       }
      2022-01-18
      1
      回复
    • 阔水连天
      阔水连天
      2022-01-18
      2022-01-18
      1
      回复
    查看更多(2)
  • 北望沣渭
    北望沣渭
    2022-01-19

    wechatpay/wechatpay-guzzle-middleware 处于维护状态,言外之意就是,即将被放弃,建议用 wechatpay/wechatpay 新包。

    另外

    PemUtil::loadPrivateKey('./path/to/mch/private/key.pem');
    

    这是要加载私钥文件,新包内用

    Rsa::from(‘file:///…');
    

    新包另配有IDE提示包 iwechatpay/openapi , 接口的数据描述例如:https://github.com/TheNorthMemory/wechatpay-openapi/blob/a21da30bc08dcb220151c3fc221cbc21f7ae6a29/src/V3/Pay/Transactions/Native.php#L18-L54 几乎就是cv操作了。


        /**
         * Native下单(同步模式)
         * @param array $options
         * @link https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/transactions/chapter3_3.shtml
         */
        public function post(array $options = [
            'json' => [
                'appid' => 'wxd678efh567hg6787',
                'mchid' => '1230000109',
                'description' => 'Image形象店-深圳腾大-QQ公仔',
                'attach' => '自定义数据',
                'out_trade_no' => '1217752501201407033233368018',
                'amount' => [
                    'total' => 100,
                    'currency' => 'CNY',
                ],
                'time_expire' => '2018-06-08T10:34:56+08:00',
                'notify_url' => 'https://www.weixin.qq.com/wxpay/pay.php',
                'goods_tag' => 'WXG',
                'detail' => [
                    'cost_price' => 608800,
                    'invoice_id' => '微信123',
                    'goods_detail' => [[
                        'merchant_goods_id' => '商品编码',
                        'wechatpay_goods_id' => '1001',
                        'goods_name' => 'iPhoneX 256G',
                        'quantity' => 1,
                        'unit_price' => 828800,
                    ],],
                ],
                'scene_info' => [
                    'payer_client_ip' => '14.23.150.211',
                    'device_id' => '013467007045764',
                    'store_info' => [
                        'id' => '0001',
                        'name' => '腾讯大厦分店',
                        'area_code' => '440305',
                        'address' => '广东省深圳市南山区科技中一道10000号',
                    ],
                ],
            ],
        ]): ResponseInterface;
    
    2022-01-19
    有用
    回复 1
    • Light
      Light
      03-28
      你是外国人吗?能不能别老是是国外的东西,醉了
      03-28
      回复
  • 星客微商城(¥900每年)
    星客微商城(¥900每年)
    2022-01-18

    我的是Java,我用Java 的时候直接传JSON对象也会报参数异常,需要传json字符串;试试把传递参数转为字符串,不要传类似map的对象。

    2022-01-18
    有用
    回复
  • Memory
    Memory
    2022-01-18

    400是协议或者参数非法,自己根据文档查参数,可以用这个脚本辅助排查https://github.com/wechatpay-apiv3/wechatpay-postman-script

    2022-01-18
    有用
    回复 6
    • 宗明星
      宗明星
      2022-01-18
      我调用的就是官方文档里面的代码参数,没改过。地址:https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_7_2.shtml的【3.2.1. 【服务端】Native下单】
      2022-01-18
      回复
    • 宗明星
      宗明星
      2022-01-18
      而且我尝试把参数去掉,发现去掉了之后也不行。
      2022-01-18
      回复
    • 宗明星
      宗明星
      2022-01-18
      我用的是guzzle,官方用的也是Guzzle么?
      2022-01-18
      回复
    • Memory
      Memory
      2022-01-18回复宗明星
      贴你代码,php sdk建议用这个https://github.com/wechatpay-apiv3/wechatpay-php
      2022-01-18
      回复
    • 宗明星
      宗明星
      2022-01-19
      代码是调用官方文档上的代码。但是调用时会提示错误,比如PemUtil::loadPrivateKey('./path/to/mch/private/key.pem')这行就会报错。
      2022-01-19
      回复
    查看更多(1)
登录 后发表内容