二つのsalesforce組織を連携する（コードあり）

1.まず、請求先の組織で下記のapexを作成。これは請求のパスと動作を用意するステプです。

~~~
@RestResource(urlMapping='/v1/AccountMgmt/')
global class AccountMgmt{
    @httpGet
    global static Account doGetMethod(){
        //domain/services/apexrest/v1/AccountMgmt/?id=xxx
    Account acc= new Account();
    Map<String,String> paramsMap = RestContext.request.params;
    String accid=paramsMap.get('id');
    acc = [select id,name,AnnualRevenue from Account where Id =:accid];
    return acc;
    }
 
    @httpDelete
    global static String doDeleteMethod(){
        //domain/services/apexrest/v1/AccountMgmt/?id=xxx
    Account acc= new Account();
    Map<String,String> paramsMap = RestContext.request.params;
    String accid=paramsMap.get('id');
    acc = [select id,name,AnnualRevenue from Account where Id =:accid];
    delete acc;
    return 'You have deleted the record succesfully!';
    }
 
   @httpPost
    global static Account doPostMethod(String Name, Integer AnnualRevenue){
        //domain/services/apexrest/v1/AccountMgmt/
        //parameter:jason
        //{"name":"xname","rate":"123"}
    Account acc= new Account(Name =name,AnnualRevenue = annualrevenue);
    insert acc;
    return acc;
    }
   @httpPut
    global static Account doPutMethod(String Name, Integer AnnualRevenue){
   //同post
    Map<String,String> paramsMap = RestContext.request.params;
    String accid=paramsMap.get('id');
     Account acc= new Account(Name =name, AnnualRevenue = annualrevenue, Id =accid);
    update acc;
    return acc;
    }
}
~~~


２．その次、請求元の組織で上記のパスを使って、calloutを実行する
そこで注意すべきことがあります。
①今回はoauth2.0で通信するです
②今回の認証はconnected app（請求先側）を使う（詳細は前編を参照、とりあえずconnected appが必要です、じゃないと他のauthentication　providerが必要）

~~~
/**
 * @description       : 
 * @author            : ChangeMeIn@UserSettingsUnder.SFDoc
 * @group             : 
 * @last modified on  : 08-29-2022
 * @last modified by  : ChangeMeIn@UserSettingsUnder.SFDoc
**/
public with sharing class restcallsample {


    public void dorestcall() {
            //請求先組織の情報を入れ
            String username = 'username';
            String password = 'pw';
            String requestValue = '{"Name":"PostTestName","AnnualRevenue":"1"}';
            //請求先組織のconnected appで取得
            String clientId ='yourclientId';
            String clientSecret ='yourclientSecret';
            Http http = new Http();
            HttpRequest request = new HttpRequest();
            //String url = 'https://salestian-dev-ed.lightning.force.com/services/apexrest/v1/AccountMgmt/';
//下記のURLは固定で、loginかtestかのどっち
            String url = 'https://login.salesforce.com/services/oauth2/token';
            request.setEndpoint(url);
            request.setMethod('POST');
            //request.setHeader('Content-Type', 'application/json;charset-UTF-8');
            request.setBody('grant_type=password' +
            '&client_id=' + EncodingUtil.urlEncode(clientId, 'UTF-8') +
            '&client_secret=' + EncodingUtil.urlEncode(clientSecret, 'UTF-8') +
            '&username=' + EncodingUtil.urlEncode(username, 'UTF-8') +
            '&password=' + EncodingUtil.urlEncode(password, 'UTF-8'));

            HttpResponse response = http.send(request);

            System.debug('BODY: '+response.getBody());
            System.debug('STATUS:'+response.getStatus());
            System.debug('STATUS_CODE:'+response.getStatusCode());
            
            
        
    }


}

~~~

3.請求元の組織でremote siteを設定する。これはセキュリティ設定など。
下記は一つの例です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491095/213b7426-3c9e-e14a-4e86-d706acfee1b4.png)

４．ここまでやっても、エラーはまた発生しました。普通ならエラーコード３０２とか４００とか、そのため、まだ未完成の部分があります。

請求先の組織を開く、下記の操作を行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491095/39ca4601-201b-be23-9a3c-fdaa5cda6746.png)

そして最後に、IP Relaxation	をRelax IP restrictionsに設定すれば、エラーは解消できます。

推測だけど、oauth2で認証する時は、IPアドレスのチェックも行う、ゆえにセキュリティ上で拒否された。

下記はIPのチェックを閉じる選択肢だけど、多分trusted Ip address rangeで勤務用のIPを登録すれば、効果は同じだと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491095/d542ce07-1f8f-d241-8650-a90f3e0a8c0c.png)

５。これで全部完了する。実行結果は下記の通りです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491095/0ed97c78-ca6d-55e0-81e9-1d59bca14263.png)