首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在java中对mpesa passcode进行散列和编码

如何在java中对mpesa passcode进行散列和编码
EN

Stack Overflow用户
提问于 2017-08-16 16:33:36
回答 3查看 221关注 0票数 0

我正在尝试动态生成一个密码,该密码将随每个api请求一起发送到mpesa api。根据文档,我需要首先连接提供的密钥与时间戳和商家id,然后做一个sha256来获得一个哈希密码,然后我应该编码到base64然而,在Java中这样做返回一个错误的编码字符串,而在PHP中类似的过程和代码工作,我会错在哪里呢?

代码语言:javascript
复制
import org.apache.commons.codec.binary.Base64;
import org.apache.cxf.headers.Header;
import org.apache.cxf.jaxb.JAXBDataBinding;
import javax.xml.bind.JAXBException;
import javax.xml.namespace.QName;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;



public class CheckoutHeaderBuilder {

    public static Header buildHeader(String merchantId, String passKey, String timestamp) throws JAXBException, NoSuchAlgorithmException, UnsupportedEncodingException {
    String hashedEncodedPass = Base64.encodeBase64String(MessageDigest.getInstance("SHA-256").digest((merchantId + passKey + timestamp).getBytes("utf-8")));

    List<Header> headers = new ArrayList<>();
    CheckOutHeader checkOutHeader = new CheckOutHeader();
    checkOutHeader.setTIMESTAMP(timestamp);
    checkOutHeader.setMERCHANTID(merchantId);
    checkOutHeader.setPASSWORD(hashedEncodedPass);
    return new Header(new QName("tns:ns", "CheckOutHeader"), checkOutHeader, new JAXBDataBinding(CheckOutHeader.class));

    }

}
EN

回答 3

Stack Overflow用户

发布于 2017-12-11 19:41:00

嗨,Japheth Ongeri Inkalimeva,你不需要使用SHA256加密。在发送Lipa na M-Pesa Online Payment API请求时,您可能不需要设置新密码。

我已经修改了你的代码,删除了SHA256加密。

代码语言:javascript
复制
import org.apache.commons.codec.binary.Base64;
import org.apache.cxf.headers.Header;
import org.apache.cxf.jaxb.JAXBDataBinding;
import javax.xml.bind.JAXBException;
import javax.xml.namespace.QName;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;


public class CheckoutHeaderBuilder  {

    public static Header buildHeader(String merchantId, String passKey, String timestamp) throws JAXBException, NoSuchAlgorithmException, UnsupportedEncodingException {
    String hashedEncodedPass = Base64.encodeBase64String((merchantId + passKey + timestamp).getBytes("utf-8"));

    List<Header> headers = new ArrayList<>();
    CheckOutHeader checkOutHeader = new CheckOutHeader();
    checkOutHeader.setTIMESTAMP(timestamp);
    checkOutHeader.setMERCHANTID(merchantId);
    checkOutHeader.setPASSWORD(hashedEncodedPass);
    return new Header(new QName("tns:ns", "CheckOutHeader"), checkOutHeader, new JAXBDataBinding(CheckOutHeader.class));

    }

}
票数 1
EN

Stack Overflow用户

发布于 2017-12-19 12:16:56

示例编码SHA256

代码语言:javascript
复制
import java.nio.charset.StandardCharsets;
import com.google.common.hash.Hashing;

String password = “123456”;
Hashing.sha256().hashString(password, StandardCharsets.UTF_8).toString();

希望能帮到你

票数 1
EN

Stack Overflow用户

发布于 2019-06-28 14:33:13

您可以通过以下方式对Mpesa的密码进行编码:

代码语言:javascript
复制
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class MpesaUtils {

    public static String getMpesaEncodedPassword(String lipaNaMpesaShortCode,
                              String password, String timeStamp) {
        StringBuilder sb = new StringBuilder();
        sb.append(lipaNaMpesaShortCode).append(password).append(timeStamp);

        byte[] bytes = sb.toString().getBytes(StandardCharsets.ISO_8859_1);
        return Base64.getEncoder().encodeToString(bytes);
    }
}

使用示例:

代码语言:javascript
复制
    String lnmShortCode = "your lipa na mpesa short code here";
    String password = "your password here";
    String timeStamp = getTimeStamp();

    String encodedPassword = MpesaUtils.getMpesaEncodedPassword(lnmShortCode, password, timeStamp);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45708750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档