Guilherme
Guilherme

Reputation: 1835

Create user using Moodle webservice

I have tried to create a new user on the Moodle by web service api.

I tried with a example that i found on the github and with another php code

In the both i receive the same response:

"Missing required key in single structure: users"

the response:

{
    "exception":"invalid_parameter_exception",
    "errorcode":"invalidparameter",
    "message":"Invalid parameter value detected",
    "debuginfo":"Missing required key in single structure: users"
}

I try to change the object by a array, but the error continues.

my code:

$functionname = 'core_user_create_users';
$user1 = new stdClass();
$user1->id = 1;
$user1->username = 'testusername1';
$user1->password = 'testpassword1';
$user1->firstname = 'testfirstname1';
$user1->lastname = 'testlastname1';
$user1->email = '[email protected]';
$user1->auth = 'manual';
$user1->idnumber = 'testidnumber1';
$user1->description = 'Hello World!';
$user1->city = 'testcity1';
$user1->country = 'BR';



$token = 'mytoken';
$domainname = 'localhost/moodle';
$functionname = 'core_user_create_users';
$restformat = 'json';
$serverurl = $domainname . '/webservice/rest/server.php'. '?wstoken=' . $token . '&wsfunction='.$functionname.'&moodlewsrestformat=' . $restformat;

$users = array($user1);
$params = array('users' => $users); 

$context = stream_context_create(array(
    'http' => array(
        'method' => 'POST',                    
        'header' => 'Content-Type: text/plain',
        'content' => $params                             
    )
));

$contents = file_get_contents($serverurl, null, $context);            

//print_r($contents);

$resposta = json_decode($contents);  

I have a valid token and the user is allowed to use the core_user_create_users function

Upvotes: 3

Views: 15571

Answers (7)

get same problem with required key 'users' solve problem with this =>

$serverurl = $domainname . '/webservice/rest/server.php'. '?wstoken=' . $token . '&wsfunction='.$functionname;
    //require_once('../curl.php');
    $curl = new curl;
    $params = "&users[0][username]=loginnn&users[0][password]=your_password1#Q&users[0][firstname]=allala&users[0][lastname]=trest&users[0][email][email protected]";
    //if rest format == 'xml', then we do not add the param for backward compatibility with Moodle < 2.2
    $restformat = ($restformat == 'json')?'&moodlewsrestformat=' . $restformat:'';
    $resp = $curl->post($serverurl . $restformat, $params);

Upvotes: 6

Chad Reitsma
Chad Reitsma

Reputation: 176

This is tested and working on Moodle 3.1.2 - I find this a much cleaner and easier to understand solution, using a proper array (as Moodle expects) native cURL and http_build_query...

Make sure the password you are providing to Moodle meets your security requirements.

    $moodledata['users'][] = array(
        'username' => 'testuser123', 
        'password' => 'TestPass1!',
        'firstname' => 'Firstname',
        'lastname' => 'Lastname',
        'email' => '[email protected]',
    );
    
    //open connection
    $token = 'your-token-goes-here';
    $domainname = 'https://yourmoodlesite.tld';
    $functionname = 'core_user_create_users';
    
    $url = $domainname . '/webservice/rest/server.php?wstoken=' . $token . '&wsfunction='.$functionname."&moodlewsrestformat=json";
    $ch = curl_init();

    //set the url, number of POST vars, POST data
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($moodledata));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    //execute post, and get our JSON as defined above with moodlewsrestformat=json
    $result = curl_exec($ch);
        
    //if you want it in an array
    //$result = json_decode($result, true);

Upvotes: 0

rfcabal
rfcabal

Reputation: 119

I have a similar problem once, in my experience is a problema with $user1->password = 'testpassword1'; Moodle needs a password with one uppercase letter and at least one simbol like / . , - _ etc.

try a new password maybe it works...

Upvotes: 1

Savage
Savage

Reputation: 2349

In our case, we added Https support, but we were still calling the Http version of the Moodle url. Changing to Https solved the problem.

Upvotes: 0

Wang Peter
Wang Peter

Reputation: 11

came across the same need today and I used your post to get the code from GitHUB so I guess I'd tell you how I fixed the error:

change your code to the following:

$users = array((array)$user1);
$params = array('users' => (array)$users);

The code from GitHUB $user1 is an object. Moodle required an Array.

Below is copied from Moodle's documentation.

[users] =>
Array 
    (
    [0] =>
        Array 
            (
            [username] => string                
            [password] => string                
            [firstname] => string                
            [lastname] => string                
            [email] => string                
            [auth] => string                
            [idnumber] => string                
            [lang] => string                
            [calendartype] => string                
            [theme] => string                
            [timezone] => string                
            [mailformat] => int                
            [description] => string                
            [city] => string                
            [country] => string                
            [firstnamephonetic] => string                
            [lastnamephonetic] => string                
            [middlename] => string                
            [alternatename] => string                
            [preferences] =>
                Array 
                    (
                    [0] =>
                        Array 
                            (
                            [type] => string                                
                            [value] => string                                
                            )
                    )                
            [customfields] =>
                Array 
                    (
                    [0] =>
                        Array 
                            (
                            [type] => string                                
                            [value] => string                                
                            )
                    )                
            )
    )

Upvotes: 0

Ravi Tiwari
Ravi Tiwari

Reputation: 41

Do not pass the ID into the user array, as it doesn't accept it as a parameter. For more details, please read the WebService API documentation for creating a user in Moodle.

Upvotes: 0

sumit
sumit

Reputation: 332

I think You must high the debugging level in your moodle system, I hope you will get more useful information regarding this error, debugging will help you to reach the exact problem. go through following path:

Home ► Site administration ► Development ► Debugging

choose Developer level from the debug messages and save the changes

Upvotes: 1

Related Questions