2017-08-16 121 views
0

我正試圖動態生成一個密碼,以便將每個api請求發送到mpesa apis。根據文檔,我需要首先連接提供的密鑰與時間戳和商人ID,然後做一個sha256來獲得一個散列密碼,然後我應該編碼到基礎64然而,在Java中這樣做返回一個錯誤的編碼字符串,而類似的過程和代碼在PHP中工作,我可能會在哪裏出錯?如何在java中對mpesa密碼進行哈希和編碼

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

    } 

} 
+0

@zaph指出,我已經編輯了標題相應 –

回答

0

Japheth Ongeri Inkalimeva,你不必使用SHA256加密。在發送Lipa na M-Pesa Online Payment API請求時,您可能無需重新設置新密碼。

我已經修改了您的代碼以刪除SHA256加密。

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

    } 

} 
+0

這是行不通的,它相當於以明文發送密碼(只用base64編碼)而不用散列,這是非常不安全的。這就是文檔特別要求sha256哈希的原因。 –

+0

你是否使用暴露在http://developer.safaricom.co.ke上的API? – Beliot

1

例編碼SHA256

import java.nio.charset.StandardCharsets; 
import com.google.common.hash.Hashing; 

String password = 「123456」; 
Hashing.sha256().hashString(password, StandardCharsets.UTF_8).toString(); 

希望能幫助你