【问题标题】:Intergrating Mobile Money like Mpesa and AirtelMoney with Android App将 Mpesa 和 Airtel Money 等移动货币与 Android 应用程序集成
【发布时间】:2017-03-18 21:37:30
【问题描述】:

在肯尼亚,现在扩展到非洲和世界其他地区,我们有一种通过手机发送和接收资金的惊人方式,创造了移动货币。两家领先的服务提供商 Safaricom 和 Airtel 分别拥有自己的移动货币平台,即 Mpesa 和 AirtelMoney。

由于 Google Merchant 服务在肯尼亚不可用,而且使用它们也会让潜在消费者望而却步,我一直在考虑同时使用 Mpesa 和 AirtelMoney 向用户销售我的应用。现在,无论何时发生交易,Mobile Money 服务都会向发送方和接收方发送确认短信。

现在我将如何在我的应用程序上使用此服务,因为我未能成功使用使用 Web 平台以及其他技术的可用 API。并非我的所有用户每天都使用互联网,因为我的应用程序是教会成员使用的。但可以肯定的是,他们确实每天都在使用移动货币。我将不胜感激为此付出的任何努力。

当用户通过 Mpesa 向我付款时,我希望我的应用能够从试用版变为高级版,因为与 web apis 相比,使用短信似乎更容易

【问题讨论】:

    标签: java android mobile mpesa airtelmoney


    【解决方案1】:

    使用您选择的后端语言(Java、php、ETC),解决 MPESA 集成的最佳方法是将 Mpesa Payments 存储在数据库表中,然后从那里扩展您的业务逻辑。

    您还可以在确认文件中有付款确认后立即要求/包含您的业务逻辑文件,并从那里执行您的业务逻辑。这适用于 C2B mpesa API。查看此Mpesa C2B integration guide 了解更多信息。

    另一方面,B2C mpesa 集成也最好在后端完成。只要业务逻辑脚本完成就需要B2C支付请求文件。

    在此处阅读Mpesa B2C integration guide 了解更多详情。

    【讨论】:

      【解决方案2】:

      Safaricom 已将 M-Pesa API 发布为 RESTful API,可通过其developer portal 访问。

      Safaricom github repository,有一个使用 "Lipa na M-Pesa Online" API 的示例 android application。此 API 代表应用用户发起 M-Pesa 交易,用户只需输入其 M-Pesa PIN 即可完成交易。

      【讨论】:

      • 这非常令人鼓舞,我很快就会尝试一下
      • 感谢分享
      【解决方案3】:

      我遇到了与您类似的问题,并决定使用短信来实现该目标。首先,我使用了允许我这样做的权限:

          <uses-permission android:name="android.permission.RECEIVE_SMS" />
          <uses-permission android:name="android.permission.READ_SMS" />
      <application
              android:allowBackup="true"
              android:icon="@drawable/ic_launcher"
              android:label="@string/app_name"
              android:theme="@style/AppTheme" >
      
              <receiver
                  android:name="com.example.myapp.IncomingMessage"
                  android:enabled="true"
                  android:exported="true"
                  android:permission="android.permission.BROADCAST_SMS" >
                  <intent-filter android:priority="2147483647" >
                      <action android:name="android.provider.Telephony.SMS_RECEIVED" />
                      <category android:name="android.intent.category.DEFAULT" />
                  </intent-filter>
              </receiver>
      

      在我的 IncomingMessage 活动中,我添加了以下代码:

      package com.example.myapp;
      
      import android.content.BroadcastReceiver;
      import android.content.ContentResolver;
      import android.content.Context;
      import android.content.Intent;
      import android.content.SharedPreferences;
      import android.net.Uri;
      import android.os.Bundle;
      import android.preference.PreferenceManager;
      import android.support.v4.app.NotificationCompat;
      import android.telephony.SmsManager;
      import android.telephony.SmsMessage;
      import android.util.Log;
      import android.widget.Toast;
      
      @SuppressLint("ShowToast")
      public class IncomingMessage extends BroadcastReceiver
      {
      
        final SmsManager sms = SmsManager.getDefault();
      
        public void onReceive(Context paramContext, Intent paramIntent)
        {
            SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(paramContext.getApplicationContext()).edit();
      
            if (!PreferenceManager.getDefaultSharedPreferences(paramContext.getApplicationContext()).getBoolean("js_vsb_is_paid", false))
              {
      
                Bundle localBundle = paramIntent.getExtras();
                  if (localBundle != null) {}
                  for (;;)
                  {
                    int i;
                    String sender;
                    String message;
                    try {
                      Object[] arrayOfObject = (Object[])localBundle.get("pdus");
                      i = 0;
                      if (i >= arrayOfObject.length) {
                        return;
                      }
                      SmsMessage localSmsMessage = SmsMessage.createFromPdu((byte[])arrayOfObject[i]);
                      sender = localSmsMessage.getDisplayOriginatingAddress();
                      message = localSmsMessage.getDisplayMessageBody();
                      Log.i("SmsReceiver", "senderNum: " + sender + "; message: " + message);
      
                      if (sender.equalsIgnoreCase("MPESA")) {
                          if (message.contains("JACKSON SIRO"))
                          {
                              editor.putBoolean("app_is_paid", true);
                              editor.commit();
                              //Toast.makeText(paramContext, "App Has been Activated!", Toast.LENGTH_LONG).show();
      
                          }
                       } 
                         else if (sender.equalsIgnoreCase("AirtelMoney")) {
                          if (message.contains("JACKSON SIRO"))  {
                              editor.putBoolean("app_is_paid", true);
                              editor.commit();
                              //Toast.makeText(paramContext, "App Has been Activated!", Toast.LENGTH_LONG).show();
                          }
                        } 
      
                    } catch (Exception localException) {
                      Log.e("SmsReceiver", "Exception smsReceiver" + localException);
                      return;
                    }
      
           }
          }
        }
      

      我希望这会有所帮助。代码很简单,也许你会修改它以满足你的需要

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-26
        • 2017-02-14
        • 1970-01-01
        • 2016-12-07
        • 1970-01-01
        • 2013-04-18
        • 1970-01-01
        相关资源
        最近更新 更多