11defmodule MomoapiElixir.Collection do
2- use HTTPoison.Base
2+ use GenServer
33
4- @ base_url Application . get_env ( :momoapi_elixir , :base_url ) || "https://sandbox.momodeveloper.mtn.com"
5-
6- @ config % {
7- subscription_key: Application . get_env ( :momoapi_elixir , :collections_subscription_key ) ,
8- user_id: Application . get_env ( :momoapi_elixir , :collections_user_id ) ,
9- api_key: Application . get_env ( :momoapi_elixir , :collections_api_key ) ,
10- callback_url: Application . get_env ( :momoapi_elixir , :collections_callback_url ) ,
11- target_environment: Application . get_env ( :momoapi_elixir , :target_environment )
12- }
13-
14- def process_request_url ( url ) do
15- @ base_url <> url
4+ defmodule Option do
5+ @ enforce_keys ~w( subscription_key user_id api_key) a
6+ defstruct subscription_key: nil , user_id: nil , api_key: nil , callback_url: nil , target_environment: "sandbox"
167 end
178
18- def process_request_headers ( headers ) do
19- headers |> set_subscription_key ( @ config . subscription_key ) |> set_target_environment ( @ config . target_environment || "sandbox" )
9+ defmodule Client do
10+ use HTTPoison.Base
11+ @ base_url Application . get_env ( :momoapi_elixir , :base_url ) || "https://sandbox.momodeveloper.mtn.com"
12+
13+ def process_request_url ( url ) do
14+ @ base_url <> url
15+ end
2016 end
2117
22- def process_response_body ( body ) do
23- body |> Poison . decode! ( )
18+ def start ( % Option { } = opts ) do
19+ GenServer . start ( __MODULE__ , opts , name: __MODULE__ )
2420 end
2521
22+ # Client
2623 @ doc """
2724 This operation is used to request a payment from a consumer (Payer). The payer will be asked to authorize the payment.
2825 The transaction will be executed once the payer has authorized the payment. The requesttopay will be in status PENDING
@@ -35,73 +32,115 @@ defmodule MomoapiElixir.Collection do
3532 externalId: "123456",
3633 payer: %{
3734 partyIdType: "MSISDN",
38- partyId: "256784275529 "
35+ partyId: "46733123450 "
3936 },
4037 payerMessage: "testing",
4138 payeeNote: "hello"
4239 }
4340
4441 """
4542 def request_to_pay ( body ) do
46- token = MomoapiElixir.Auth . authorise_collections ( @ config )
47- headers = add_reference_id ( reference_id ( ) ) |> add_token ( token )
48- request_to_pay ( headers , body )
49- end
50-
51- defp request_to_pay ( headers , body ) do
52- case post ( "/collection/v1_0/requesttopay" , Poison . encode! ( body ) , headers ) do
53- { :ok , % HTTPoison.Response { status_code: 202 , body: _body } } -> reference_id
54- end
43+ body = validate_collections ( body )
44+ GenServer . call ( __MODULE__ , { :request_to_pay , body } )
5545 end
5646
5747 @ doc """
5848 Get the balance of the account
5949 """
6050 def get_balance do
61- token = MomoapiElixir.Auth . authorise_collections ( @ config )
62- headers = add_reference_id ( reference_id ( ) ) |> add_token ( token )
63- get_balance ( headers )
64- end
65-
66- defp get_balance ( headers ) do
67- case get ( "/collection/v1_0/account/balance" , headers ) do
68- { :ok , % HTTPoison.Response { body: body , status_code: 200 } } -> body
69- end
51+ GenServer . call ( __MODULE__ , :get_balance )
7052 end
7153
72-
7354 @ doc """
7455 This method is used to retrieve transaction information. You can invoke it at intervals until your transaction fails or succeeds
7556 """
7657 def get_transaction_status ( reference_id ) do
77- token = MomoapiElixir.Auth . authorise_collections ( @ config )
78- headers = add_reference_id ( reference_id ( ) ) |> add_token ( token )
79- get_transaction_status ( headers , reference_id )
58+ GenServer . call ( __MODULE__ , { :get_transaction_status , reference_id } )
59+ end
60+
61+ # Callbacks
62+ def init ( % Option { subscription_key: subscription_key , user_id: user_id , api_key: api_key } ) do
63+ token = MomoapiElixir.Auth . authorise_collections (
64+ % { subscription_key: subscription_key , user_id: user_id , api_key: api_key }
65+ )
66+ { :ok , % { subscription_key: subscription_key , token: token } }
67+ end
68+
69+ def handle_call ( { :request_to_pay , body } , _from , state ) do
70+ reference_id = reference_id ( )
71+ body_encoded = Poison . encode! ( body )
72+ headers = [
73+ { "Authorization" , "Bearer #{ state . token } " } ,
74+ { "Ocp-Apim-Subscription-Key" , state . subscription_key } ,
75+ { "X-Reference-Id" , reference_id } ,
76+ { "X-Target-Environment" , "sandbox" }
77+ ]
78+ case Client . post ( "/collection/v1_0/requesttopay" , body_encoded , headers ) do
79+ { :ok , % HTTPoison.Response { status_code: 202 , body: _body } } -> { :reply , reference_id , state }
80+ { :ok , % HTTPoison.Response { status_code: 500 , body: body } } -> { :reply , { :error , % { code: 500 , body: Poison . decode! ( body ) } } , state }
81+ { :ok , % HTTPoison.Response { status_code: 500 , body: "" } } -> { :reply , { :error , % { code: 500 , body: "" } } , state }
82+ { :ok , % HTTPoison.Response { status_code: 400 , body: "" } } -> { :reply , { :error , % { code: 400 , body: "" } } , state }
83+ { :ok , % HTTPoison.Response { status_code: 400 , body: body } } -> { :reply , { :error , % { code: 400 , body: Poison . decode! ( body ) } } , state }
84+ end
8085 end
8186
82- def get_transaction_status ( headers , reference_id ) do
83- case get ( "/collection/v1_0/requesttopay/#{ reference_id } " , headers ) do
84- { :ok , % HTTPoison.Response { body: body , status_code: 200 } } -> body
87+ def handle_call ( :get_balance , _from , state ) do
88+ headers = [
89+ { "Authorization" , "Bearer #{ state . token } " } ,
90+ { "Ocp-Apim-Subscription-Key" , state . subscription_key } ,
91+ { "X-Target-Environment" , "sandbox" }
92+ ]
93+ case Client . get ( "/collection/v1_0/account/balance" , headers ) do
94+ { :ok , % HTTPoison.Response { body: body , status_code: 200 } } -> { :reply , Poison . decode! ( body ) , state }
95+ { :ok , % HTTPoison.Response { body: body , status_code: 404 } } -> { :reply , { :error , Poison . decode! ( body ) } , state }
96+ { :ok , % HTTPoison.Response { body: body , status_code: 500 } } -> { :reply , { :error , Poison . decode! ( body ) } , state }
8597 end
8698 end
8799
100+ def handle_call ( { :get_transaction_status , reference_id } , _from , state ) do
101+ headers = [
102+ { "Authorization" , "Bearer #{ state . token } " } ,
103+ { "Ocp-Apim-Subscription-Key" , state . subscription_key } ,
104+ { "X-Target-Environment" , "sandbox" } ,
105+ { "X-Reference-Id" , reference_id } ,
106+ ]
107+ case Client . get ( "/collection/v1_0/requesttopay/#{ reference_id } " , headers ) do
108+ { :ok , % HTTPoison.Response { body: body , status_code: 200 } } -> { :reply , Poison . decode! ( body ) , state }
109+ end
110+
111+ end
112+
88113 defp reference_id do
89114 UUID . uuid4 ( )
90115 end
91116
92- defp set_subscription_key ( headers \\ [ ] , subscription_key ) do
93- [ { "Ocp-Apim-Subscription-Key" , subscription_key } | headers ]
117+ defp validate_collections (
118+ % {
119+ amount: amount
120+ }
121+ ) when is_nil ( amount ) or amount == "" do
122+ raise "Amount is required"
94123 end
95124
96- defp set_target_environment ( headers \\ [ ] , target_environment ) do
97- [ { "X-Target-Environment" , target_environment } | headers ]
125+ defp validate_collections (
126+ % {
127+ currency: currency
128+ }
129+ ) when is_nil ( currency ) or currency == "" do
130+ raise "Currency is required"
98131 end
99132
100- defp add_reference_id ( headers \\ [ ] , reference_id ) do
101- [ { "X-Reference-Id" , reference_id } | headers ]
133+ defp validate_collections (
134+ % {
135+ payer: % {
136+ partyId: party_id
137+ } ,
138+ }
139+ ) when is_nil ( party_id ) or party_id == "" do
140+ raise "Party id is required"
102141 end
103142
104- defp add_token ( headers \\ [ ] , token ) do
105- [ { "Authorization" , "Bearer #{ token } " } | headers ]
143+ defp validate_collections ( body ) do
144+ body
106145 end
107146end
0 commit comments