我正在申请贷款。我被困在这个如何整合MPESA因为我住在非洲以外。
这是链接PESAPI。我完成了第3步,但现在我无法理解下一步该做什么。
问1)我可以将它与我的Loan app android集成吗?
问2)接下来该做什么请指导我从最后一个弱者那里坚持下去。
答案 0 :(得分:1)
Pesa pi不能用于预期目的。 pesapi做的是从您的Android手机获取确认消息并将该消息推送到您的应用程序。
此上下文中的消息是一旦通过lipa na mpesa付款并且支付账单,mpesa发送到收款人的注册手机号码的消息。
Mutwiri建议的是,您可以从mpesa网站http://www.safaricom.co.ke/business/sme/m-pesa-payment-solutions/m-pesa-api获取API 并为您的应用程序构建一个中间件。
指针:查看B2C和C2B- paybill和lipa na mpesa文档。
答案 1 :(得分:1)
M-PESA API在线结帐Java / Android如何
在发布M-PESA API之后,您将需要创建一个Web服务客户端来执行SOAP请求并处理来自API调用的响应
我将为面向集成现有Java应用程序的Java开发人员提供快速入门指南。
<强>先决条件强>
JDK 7或最新
说明步骤
从safaricom网站下载完整的M-PESA API指南 阅读开发人员指南C2B_OnlineCheckout_V2.0.doc 生成JAX-WS工件。您的客户端将使用此API访问已发布的Web服务。 生成JAX-WS工件 我们将使用wsimport工具来解析checkout WSDL文件并生成所需的文件。
mkdir src
wsimport -XadditionalHeaders -clientjar safaricom-lipanampesa-onlinecheckout-wsdl.jar -s src -p ke.co.makara.integration.mpesa.lnmocheckout http://safaricom.co.ke/mpesa_online/lnmo_checkout_server.php?wsdl
检查wsimport --help以了解上述选项; 请注意生成的人工制品的包目录。 WSDL托管在lipa na M-PESA端点上。为此,我们使用生产网址。 -clientjar选项,Java 7中的新增功能,简化了操作。否则你必须使用-wsdllocation /META-INF/wsdl/Checkout.wsdl选项。然后在META-INF中复制wsdl以减轻Java 6 wsimport限制。见下面的限制。 (可选)创建源jar 在src文件夹里面运行命令。
jar cvf safaricom-lipanampesa-onlinecheckout-source-wsdl.jar ke/
接下来,我们使用Web服务工件从Web服务客户端调用Web服务。
生成的工件
服务端点接口(SEI) - LNMOPortType.java 服务类 - LnmoCheckoutService.java 如果WSDL中存在wsdl:fault,则为Exception类 从模式类型映射的Java类,例如ProcessCheckOutRequest.java 如果WSDL中存在wsdl:消息,则异步响应bean,例如ProcessCheckOutResponse.java
网络服务客户端
接下来,我们使用Web服务工件从Web服务客户端调用Web服务。 这可以是从前端调用的servlet。超出范围。为简单起见,我将创建一个java类〜一个独立的控制台
创建一个java类说LNMOCheckoutTester 在Java客户端应用程序中,创建LnmoCheckoutService服务的实例
LnmoCheckoutService lnmoCheckoutService = new LnmoCheckoutService(); // lina na mpesa online checkout instance
将在构建期间创建Service类。 使用getLnmoCheckout()方法从服务获取服务的代理
LNMOPortType soap = lnmoCheckoutService.getLnmoCheckout();
端口携带协议绑定和服务端点地址信息。 配置服务端点 在javax.xml.ws.BindingProvider接口
上配置请求上下文属性((BindingProvider)soap).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url + "lnmo_checkout_server.php"); // specifying this property on the RequestContext
JAX-WS为动态调用服务端点操作提供支持。 我将Web服务URL存储在数据库中,并将wsdl端点附加到此URL。这会在运行时配置端点。 撰写我们的客户请求M-PESA结账消息 这是消息有效负载
ProcessCheckOutRequest checkOutRequest = objFactory.createProcessCheckOutRequest();
checkOutRequest.setMERCHANTTRANSACTIONID("54635469064");
checkOutRequest.setREFERENCEID("TD346534GH");
checkOutRequest.setAMOUNT(13300);
checkOutRequest.setMSISDN("0721XXXXXX");
checkOutRequest.setENCPARAMS("");
checkOutRequest.setCALLBACKURL("https://makara.co.ke:8443/odt/checkout");
checkOutRequest.setCALLBACKMETHOD("GET");
checkOutRequest.setTIMESTAMP(String.valueOf(date.getTime()));
配置请求标头 遵循Safaricom文档中的业务规则来构建密码。见附件。 对于String merchantId,String passkey,Date requestTimeStamp;将连接字符串转换为字节,将字节哈希以获取任意二进制数据并将二进制数据转换为字符串使用base64
CheckOutHeader requestHeader = objFactory.createCheckOutHeader();
requestHeader.setMERCHANTID(MERCHANT_ID);
Date timestamp = new Date();
String encryptedPassword = getEncryptedPassword(MERCHANT_ID, PASSKEY, timestamp);
requestHeader.setPASSWORD(encryptedPassword.toUpperCase());
requestHeader.setTIMESTAMP(String.valueOf(timestamp.getTime()));
使用 dispatch 基于stab的客户端调用服务端点
soap.processCheckOut(checkOutRequest,requestHeader);
根据您的业务需求处理来自服务的响应消息
ProcessCheckOutResponse checkOutResponse = new ProcessCheckOutResponse();
checkOutResponse.getRETURNCODE();
checkOutResponse.getDESCRIPTION();
checkOutResponse.getTRXID();
checkOutResponse.getCUSTMSG();
跟踪SOAP流量
调试Web服务应用程序的一个常见步骤是检查请求和响应SOAP消息 配置客户端以使用JAX-WS转储请求和响应 System.setProperty(&#34; com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump&#34;,&#34; true&#34;);
源代码
/*
* LNMOCheckoutTester.java
*
* Nov 20, 2016 Joseph Makara - Created File to tester Lina Na M-PESA Online checkout
*
*
*/
package testMe;
import java.io.*;
import java.security.*;
import java.util.*;
import javax.net.ssl.*;
import javax.xml.ws.*;
import ke.co.makara.integration.mpesa.lnmocheckout.*;
import org.apache.commons.codec.binary.*;
/**
* @author Joseph Makara
*
*/
public class LNMOCheckoutTester {
private static final String PASSKEY = "234fdsghfsg5654dgfhgf6dsfdsafsd43dgfhdgfdgfh74567";
private static final String MERCHANT_ID = "678fsgd54354";
private static final String REFERENCE_ID = "";
private static final String ENDPOINT_URL = "https://safaricom.co.ke/mpesa_online/";
private static final String CALLBACK_URL = "https://makara.co.ke:8443/odt/checkout";
private static final String CALLBACK_METHOD = "GET";
static {
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
if (hostname.equals("safaricom.co.ke")) return true;
return false;
}
});
}
/**
* @param args
*/
public static void main(String[] args) {
LNMOPortType soap = outBoundLNMOCheckout(ENDPOINT_URL);
ObjectFactory objFactory = new ObjectFactory();
CheckOutHeader requestHeader = objFactory.createCheckOutHeader();
requestHeader.setMERCHANTID(MERCHANT_ID);
Date timestamp = new Date();
String encryptedPassword = getEncryptedPassword(MERCHANT_ID, PASSKEY, timestamp);
requestHeader.setPASSWORD(encryptedPassword);
requestHeader.setTIMESTAMP(String.valueOf(timestamp.getTime()));
ProcessCheckOutRequest checkOutRequest = objFactory.createProcessCheckOutRequest();
checkOutRequest = processCheckOut(timestamp);
soap.processCheckOut(checkOutRequest, requestHeader);
ProcessCheckOutResponse checkOutResponse = new ProcessCheckOutResponse();
checkOutResponse.getRETURNCODE();
checkOutResponse.getDESCRIPTION();
checkOutResponse.getTRXID();
checkOutResponse.getENCPARAMS();
checkOutResponse.getCUSTMSG();
}
private static ProcessCheckOutRequest processCheckOut(Date date){
ProcessCheckOutRequest checkOutRequest = new ProcessCheckOutRequest();
checkOutRequest.setMERCHANTTRANSACTIONID("54635469064");
checkOutRequest.setREFERENCEID("TD346534GH");
checkOutRequest.setAMOUNT(3.45);
checkOutRequest.setMSISDN("0721826284");
checkOutRequest.setENCPARAMS("");
checkOutRequest.setCALLBACKURL(CALLBACK_URL);
checkOutRequest.setCALLBACKMETHOD(CALLBACK_METHOD);
checkOutRequest.setTIMESTAMP(String.valueOf(date.getTime()));
return checkOutRequest;
}
/**
* Convert the concatenated string to bytes
* Hash the bytes to get arbitary binary data
* Convert the binary data to string use base64
*
* @param merchantId
* @param passkey
* @param date
* @return
*/
private static String getEncryptedPassword(String merchantId, String passkey, Date date) {
String encodedPassword = null;
StringBuilder builder = new StringBuilder(merchantId)
.append(passkey)
.append(date.getTime());
try {
String sha256 = getSHA256Hash(builder.toString());
return new String(Base64.encodeBase64(sha256.getBytes("UTF-8")));;
} catch (NoSuchAlgorithmException | UnsupportedEncodingException ex) {
ex.printStackTrace();
}
return encodedPassword;
}
private static LNMOPortType outBoundLNMOCheckout(String url) {
System.setProperty("com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump", "true");
LnmoCheckoutService lnmoCheckoutService = new LnmoCheckoutService();
LNMOPortType soap = lnmoCheckoutService.getLnmoCheckout();
((BindingProvider)soap).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
url + "lnmo_checkout_server.php");
return soap;
}
private static String getSHA256Hash(String input) throws NoSuchAlgorithmException {
MessageDigest mDigest = MessageDigest.getInstance("SHA-256");
byte[] result = mDigest.digest(input.getBytes());
StringBuffer sb = new StringBuffer();
for (int i = 0; i < result.length; i++) {
sb.append(Integer.toString((result[i] & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
}
}
样本肥皂请求
[HTTP request - https://safaricom.co.ke/mpesa_online/lnmo_checkout_server.php]---
Accept: text/xml, multipart/related
Content-Type: text/xml; charset=utf-8
SOAPAction: ""
User-Agent: JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<ns2:CheckOutHeader xmlns:ns2="tns:ns">
<MERCHANT_ID>F2678987M</MERCHANT_ID>
<PASSWORD>QQFSOITZB5OJMJTW073/SCWLN5WMDL6LO0FP6DJZ8TQ=</PASSWORD>
<TIMESTAMP>1479116220855</TIMESTAMP>
</ns2:CheckOutHeader>
</S:Header>
<S:Body>
<ns2:processCheckOutRequest xmlns:ns2="tns:ns">
<MERCHANT_TRANSACTION_ID>54635469064</MERCHANT_TRANSACTION_ID>
<REFERENCE_ID>TD346534GH</REFERENCE_ID>
<AMOUNT>3.45</AMOUNT>
<MSISDN>0721826284</MSISDN>
<ENC_PARAMS></ENC_PARAMS>
<CALL_BACK_URL>https://makara.co.ke:8443/odt/checkout</CALL_BACK_URL>
<CALL_BACK_METHOD>lnmo</CALL_BACK_METHOD>
<TIMESTAMP>1479116220855</TIMESTAMP>
</ns2:processCheckOutRequest>
</S:Body>
</S:Envelope>
您只需联系Safaricom获取演示测试组织详细信息(商家ID和PassKey)
答案 2 :(得分:1)
M-Pesa API目前是一个SOAP API,SOAP在Android上不是原生的,因此在您的应用上集成API是一大堆工作。我写了Chowder来帮助开发人员轻松处理M-Pesa,这就是你需要做的所有事情:
//Add a new dependency
dependencies {
compile 'com.toe.chowder:chowder:0.7.6'
}
创建一个Chowder实例:
//You can create a single global variable for Chowder like this
Chowder chowder = new Chowder(YourActivity.this, PAYBILL_NUMBER, PASSKEY, this);
//You can also add your callback URL using this constructor
Chowder chowder = new Chowder(YourActivity.this, PAYBILL_NUMBER, callbackUrl ,PASSKEY, this);
处理您的付款:
//You can then use processPayment() to process individual payments
chowder.processPayment(amount, phoneNumber, productId);
确认付款:
chowder.checkTransactionStatus(PAYBILL_NUMBER, transactionId);
还有更多示例代码和测试Paybill编号以及密钥here。
答案 3 :(得分:0)
这看起来像一年前,但如果仍然找不到解决方案,你可以看一下。
https://bitbucket.org/mwanzias/mpesaonlinecheckout/downloads/README.md
从这里你可以从android应用程序直接发布到执行mpesa通信的后端系统。此处描述的演示提供了在线结账功能,如果您希望将其扩展到B2C,B2B和C2B通知,那么您可以联系所有者。
您还可以查看以下内容,看看您是否可以进行分叉和调整。
答案 4 :(得分:0)
如果您仍然感兴趣,Safaricom最近推出了REST based interface消费MPesa API。他们有文档,可以找到关于如何使用它的非常好的教程here。要在您的应用程序上使用,您需要一个后端接口作为MPesa的中介,因为它们的大多数API都是异步的。