0

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

由于肯尼亚没有 Google Merchant 服务,而且使用它们也会避开潜在消费者,我一直在考虑使用 Mpesa 和 AirtelMoney 向用户销售我的应用程序。现在,无论何时发生交易,移动货币服务都会向发送方和接收方发送确认短信。

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

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

4

3 回答 3

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;
              }

     }
    }
  }

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

于 2016-11-05T03:00:25.407 回答
2

Safaricom 已将 M-Pesa API 发布为可通过其开发人员门户访问的 RESTful API 。

Safaricom github存储库有一个使用“Lipa na M-Pesa Online” API的示例android 应用程序。此 API 代表应用程序用户发起 M-Pesa 交易,用户只需输入其 M-Pesa PIN 即可完成交易。

于 2017-12-05T14:26:03.847 回答
0

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

只要确认文件中有付款确认,您还可以要求/包含您的业务逻辑文件,并从那里执行您的业务逻辑。这适用于 C2B mpesa API。查看此Mpesa C2B 集成指南以获取更多信息。

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

在此处阅读Mpesa B2C 集成指南以获取更多详细信息。

于 2019-02-03T22:57:13.743 回答