首页 > 解决方案 > Laravel SaveJson 到数据库

问题描述

我是 Json 和 API 的新手,我需要你的帮助来理解这个错误。我希望将 JSON 数据保存在数据库表(MpesaStkPush)中,我得到的只是一个错误。

我尝试从 json_encode 更改为 json_decode。

laravel.log [2021-02-12 19:13:41] local.ERROR: Symfony\Component\HttpFoundation\Response::setContent(): Argument #1 ($content) must be of type ?string, stdClass given

Mpesa控制器

public function stkPush(Request $request){

        
    $amount = $request->totalAmount;
    
    $url ='https://sandbox.safaricom.co.ke/mpesa/stkpush/v1/processrequest';
    $curl_post_data =[
        'BusinessShortCode' => 174379,
        'Password' => $this->lipaNaMpesaPassword(),
        'Timestamp'=>Carbon::rawParse('now')->format('YmdHms'),
        'TransactionType'=> 'CustomerPayBillOnline',
        //'Amount' => $amount,
        'Amount' => '1',
        'PartyA' =>'254710909198',
        'PartyB' =>174379,
        'PhoneNumber'=>'254710909198',
        'CallBackURL'=> 'https://375e0eb81d88.ngrok.io/api/stk/push/callback/url',
        'AccountReference'=>"Wabe Digital Agency",
        'TransactionDesc'=> "Lipa Na Mpesa"

    ];
    $data_string =json_encode($curl_post_data);
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type:application/json','Authorization:Bearer '.$this->newAccessToken()));
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data_string);
    $curl_response = curl_exec($curl);
    return json_encode($curl_response);
    
}

 public function mpesaRes(Request $request){

    $response =json_decode($request->getContent());
    if (property_exists($response, property: 'Body') && $response->Body->stkCallback->ResultCode =='0'){
        $merchant_request_id=$response->Body->stkCallback->MerchantRequestID;
        $checkout_request_id=$response->Body->stkCallback->CheckoutRequestID;
        $trn = new MpesaStkPush;

        $trn =MpesaStkPush::where('merchant_request_id', $merchant_request_id)->where('checkout_request_id', $checkout_request_id)->first();

    
        $data=[
            'result_desc'=> $response->Body->stkCallback->ResultDesc,
            'result_code'=> $response->Body->stkCallback->ResultCode,
            'merchant_request_id' => $merchant_request_id,
            'checkout_request_id' => $checkout_request_id,
            'amount' => $response->Body->stkCallback->CallbackMetadata[0]->Value,
            'mpesa_receipt_number'=> $response->Body->stkCallback->CallbackMetadata[1]->Value,
        //'b2c_utility_account_available_funds',
            'transaction_date' => $response->Body->stkCallback->CallbackMetadata[2]->Value,
            'phone_number'=> $response->Body->stkCallback->CallbackMetadata[3]->Value,
        ];


        $trn->fill($data)->save();
    . K

标签: laravel

解决方案


更加注意日志。在您的情况下,它指出您与类型不匹配(放置一个类实例而不是字符串)

无论如何,我建议您阅读以下 php 函数文档:

https://www.php.net/manual/en/function.json-decode.php

第二个参数是一个技巧:如果它设置为 true,你将得到一个数组而不是 stdClass 实例。

更重要的是,请求实例有更雄辩的方法。


推荐阅读