diff --git a/.gitignore b/.gitignore index 83cd478..c6f95b0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ -.idea/* +.idea/ demo/demo -demo/secrets.go \ No newline at end of file +demo/secrets.go diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/README.md b/README.md index 78d9fd4..ff3a7d2 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,21 @@ go get github.com/AndroidStudyOpenSource/africastalking-go/account go get github.com/AndroidStudyOpenSource/africastalking-go/payment ``` +## Demo +In order to run the demo, export the the following values to your environment. They can be found/generated at the Africa's Talking Dashboard. + +``` sh +export AT_APIKEY=Your-AfricasTalking-API-KEY +export AT_USERNAME=Your-AfricasTalking-APP-USERNAME +export AT_SHORTCODE=Your-AfricasTalking-APP-Shortcode +``` + +That's all's that required. Assuming its a sandbox app, here's to run the demo: + +``` sh +cd demo +go run main.go -e sandbox -m "Hello gopher!" -r "+254700000000" +``` ## Usage The package needs to be configured with your app username and API key (which you can get from the dashboard). You can also declare if you are running in production or in sandbox. @@ -59,7 +74,7 @@ import ( "fmt" "log" - africastkng "github.com/AndroidStudyOpenSource/africastalking-go/sms" + "github.com/AndroidStudyOpenSource/africastalking-go/sms" ) const ( diff --git a/account/account.go b/account/account.go index 9488dc9..4aba83f 100644 --- a/account/account.go +++ b/account/account.go @@ -1,11 +1,12 @@ package account import ( - "africastalking/util" "encoding/json" "fmt" "net/http" "time" + + "github.com/AndroidStudyOpenSource/africastalking-go/util" ) // Response is a model diff --git a/demo/main.go b/demo/main.go index 331e288..6cde8d0 100644 --- a/demo/main.go +++ b/demo/main.go @@ -6,13 +6,14 @@ import ( "log" "os" + "github.com/AndroidStudyOpenSource/africastalking-go/account" "github.com/AndroidStudyOpenSource/africastalking-go/sms" - "africastalking/account" ) -const ( - apiKey = "" - username = "" +var ( + apiKey = os.Getenv("AT_APIKEY") + username = os.Getenv("AT_USERNAME") + shortcode = os.Getenv("AT_SHORTCODE") ) func main() { @@ -22,24 +23,28 @@ func main() { flag.Parse() if *recipient == "" || *message == "" { - log.Println("please enter recipient and message") - os.Exit(1) + log.Fatal("please enter all required arguments. see --help") + } + + if apiKey == "" || username == "" { + log.Fatal("missing required environment variables: AT_APIKEY, AT_USERNAME") } smsService := sms.NewService(username, apiKey, *env) - // Entered at the commandline - sendResponse, err := smsService.Send("Me4u", *recipient, *message) + + sendResponse, err := smsService.Send(shortcode, *recipient, *message) if err != nil { - fmt.Println(err) - } else { - fmt.Println(sendResponse) + fmt.Printf("Failed to send sms: %v", err) } + fmt.Printf("SMS Send reponse: %v\n", sendResponse) accountService := account.NewService(username, apiKey, *env) user, err := accountService.GetUser() if err != nil { fmt.Println(err) - } else { - fmt.Println(user) + return } + + fmt.Printf("User: %v\n", user) + } diff --git a/sms/sms.go b/sms/sms.go index dda629d..4b455e8 100644 --- a/sms/sms.go +++ b/sms/sms.go @@ -2,8 +2,8 @@ package sms import ( "encoding/json" + "errors" "fmt" - "log" "net/http" "net/url" "strconv" @@ -55,12 +55,11 @@ func (service Service) Send(from, to, message string) (*SendMessageResponse, err if err != nil { return nil, err } - - var smsMessageResponse SendMessageResponse - json.NewDecoder(res.Body).Decode(&smsMessageResponse) - log.Println(res.Body) defer res.Body.Close() - + var smsMessageResponse SendMessageResponse + if err := json.NewDecoder(res.Body).Decode(&smsMessageResponse); err != nil { + return nil, errors.New("unable to parse sms response") + } return &smsMessageResponse, nil } @@ -88,17 +87,17 @@ func (service Service) SendBulk(from, to, message string, bulkMode int, enqueue if err != nil { return nil, err } + defer res.Body.Close() var smsMessageResponse SendMessageResponse json.NewDecoder(res.Body).Decode(&smsMessageResponse) - defer res.Body.Close() return &smsMessageResponse, nil } // SendPremium - POST func (service Service) SendPremium(username, to, from, message, keyword, -linkID, retryDurationInHours string, bulkMode int) (*SendMessageResponse, error) { + linkID, retryDurationInHours string, bulkMode int) (*SendMessageResponse, error) { values := url.Values{} values.Set("username", username) values.Set("to", to) @@ -117,10 +116,10 @@ linkID, retryDurationInHours string, bulkMode int) (*SendMessageResponse, error) if err != nil { return nil, err } + defer res.Body.Close() var smsMessageResponse SendMessageResponse json.NewDecoder(res.Body).Decode(&smsMessageResponse) - defer res.Body.Close() return &smsMessageResponse, nil } @@ -136,10 +135,10 @@ func (service Service) FetchMessage(username, lastReceivedID string) (*FetchMess if err != nil { return nil, fmt.Errorf("could not get response: %v", err) } + defer res.Body.Close() var fmr FetchMessageResponse json.NewDecoder(res.Body).Decode(&fmr) - defer res.Body.Close() return &fmr, nil } diff --git a/util/utils.go b/util/utils.go index 97a511e..4ce7699 100644 --- a/util/utils.go +++ b/util/utils.go @@ -1,5 +1,8 @@ package util +import "fmt" + +// Constants for responses const ( PendingConfirmation = "PendingConfirmation" PendingValidation = "PendingValidation" @@ -13,11 +16,7 @@ const ( // GetAPIHost returns either sandbox or prod func GetAPIHost(env string) string { - if env == "sandbox" { - return "https://api.sandbox.africastalking.com" - } - // env == "production" - return "https://api.africastalking.com" + return getHost(env, "api") } // GetSmsURL is the sms endpoint @@ -25,44 +24,55 @@ func GetSmsURL(env string) string { return GetAPIHost(env) + "/version1/messaging" } +// GetPaymentHost returns the payments domain func GetPaymentHost(env string) string { - if env == "sandbox" { - return "https://payments.sandbox.africastalking.com" - } - return "https://payments.africastalking.com" + return getHost(env, "payments") } +// GetVoiceHost returns the voice host domain func GetVoiceHost(env string) string { - if env == "sandbox" { - return "https://voice.sandbox.africastalking.com" - } - return "https://voice.africastalking.com" + return getHost(env, "voice") } +// GetVoiceUrl returns the voice endpoint func GetVoiceUrl(env string) string { return GetVoiceHost(env) } +// GetSubscriptionUrl returns the Subscription endpoint func GetSubscriptionUrl(env string) string { return GetAPIHost(env) + "/version1/subscription" } +// GetUserDataUrl returns the user data endpoint func GetUserDataUrl(env string) string { return GetAPIHost(env) + "/version1/user" } +// GetAirtimeUrl returns the airtime endpoint func GetAirtimeUrl(env string) string { return GetAPIHost(env) + "/version1/airtime" } +// GetMobilePaymentCheckoutUrl returns the mobile payments checkout endpoint func GetMobilePaymentCheckoutUrl(env string) string { return GetPaymentHost(env) + "/mobile/checkout/request" } +// GetMobilePaymentB2BUrl returns the Mobile Payments B2B endpoint func GetMobilePaymentB2BUrl(env string) string { return GetPaymentHost(env) + "/mobile/b2b/request" } +// GetMobilePaymentB2CUrl returns the Mobile Payment B2C endpoint func GetMobilePaymentB2CUrl(env string) string { return GetPaymentHost(env) + "/mobile/b2c/request" } + +func getHost(env, service string) string { + if env != "sandbox" { + return fmt.Sprintf("https://%s.africastalking.com", service) + } + return fmt.Sprintf("https://%s.sandbox.africastalking.com", service) + +}