android 微信加密方式,Android 微信支付加密

项目中接入支付功能,支付宝一次过

唯独这个微信,后台说是前端自己加密(真坑爹)

如何接入微信支付就不说了,重点加密

客户端微信加密

//activity中

privateIWXAPI iwxapi;

// PayUtils payUtils = new PayUtils();

        //传递后台传递过来的json

//          payUtils.startWeChatPay(this,bean);

//跳转微信支付

iwxapi = WXAPIFactory.createWXAPI(this, null);

iwxapi.registerApp(Constant.WECHAT_APPID);

WXOrderPayBean.ResponseBean.ContBean contBean = bean.getResponse().getCont();

if (contBean == null){

return;

}

Map map = new HashMap<>();

map.put("appid",Constant.WECHAT_APPID);

map.put("partnerid",contBean.getMch_id());

map.put("prepayid",contBean.getPrepay_id());

map.put("package","Sign=WXPay");

map.put("noncestr",contBean.getNonce_str());

map.put("timestamp", OpenWXUtils.getTimeStamp());

PayReq req = new PayReq();

req.appId =Constant.WECHAT_APPID;

req.partnerId = contBean.getMch_id();

req.prepayId = contBean.getPrepay_id();

req.packageValue = "Sign=WXPay";

req.nonceStr = contBean.getNonce_str();

req.timeStamp = OpenWXUtils.getTimeStamp();

req.sign = OpenWXUtils.openWechatPaySign(map,Constant.WECHAT_SECRET);

iwxapi.sendReq(req);

加密类

/**

* Created by zhang_dawn on  2019/8/23

* Descride:

*/

public class OpenWXUtils {

/**

* 唤醒微信支付 的所有参数 进行签名

*

* @param parameters

* @return

*/

@SuppressWarnings("unchecked")

public static String openWechatPaySign(Map parameters, String key) {

final Map sordMap = new TreeMap<>(parameters);

List params = new ArrayList<>();

for (Map.Entry entry : sordMap.entrySet()) {

params.add(entry.getKey() + "=" + entry.getValue());

}

params.add("key=" + key);

String pararmStr = (String) join(params.iterator(), "&");

Log.e("按照微信的签名规则排好序的字符串---->", pararmStr);

String sign = MD5Encode(pararmStr, "UTF-8").toUpperCase();

return sign;

}

public static String MD5Encode(String origin, String charsetname) {

String resultString = null;

try {

resultString = new String(origin);

MessageDigest md = MessageDigest.getInstance("MD5");

if (charsetname == null || "".equals(charsetname))

resultString = byteArrayToHexString(md.digest(resultString

.getBytes()));

else

resultString = byteArrayToHexString(md.digest(resultString

.getBytes(charsetname)));

} catch (Exception exception) {

}

return resultString;

}

private static final String hexDigits[] = {"0", "1", "2", "3", "4", "5",

"6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};

private static String byteArrayToHexString(byte b[]) {

StringBuffer resultSb = new StringBuffer();

for (int i = 0; i < b.length; i++)

resultSb.append(byteToHexString(b[i]));

return resultSb.toString();

}

private static String byteToHexString(byte b) {

int n = b;

if (n < 0)

n += 256;

int d1 = n / 16;

int d2 = n % 16;

return hexDigits[d1] + hexDigits[d2];

}

public static boolean isEmpty(CharSequence charSequence) {

return charSequence == null || charSequence.length() == 0;

}

public static boolean equalsAnyIgnoreCase(CharSequence c1, CharSequence c2) {

return !isEmpty(c1) && !isEmpty(c2) && c1.toString().toLowerCase().equalsIgnoreCase(c2.toString());

}

public static boolean isNoneEmpty(final CharSequence css) {

return !isEmpty(css);

}

public static boolean equalsIgnoreCase(final CharSequence str1, final CharSequence str2) {

return equalsAnyIgnoreCase(str1, str2);

}

public static boolean equals(final CharSequence cs1, final CharSequence cs2) {

return !isEmpty(cs1) && !isEmpty(cs2) && cs1.toString().equals(cs2.toString());

}

public static int length(final CharSequence cs) {

return cs == null ? 0 : cs.length();

}

public static String join(final Iterator> iterator, final String separator) {

// handle null, zero and one elements before building a buffer

if (iterator == null) {

return null;

}

if (!iterator.hasNext()) {

return "";

}

final Object first = iterator.next();

if (!iterator.hasNext()) {

// ObjectUtils.toString(Object) has been deprecated in 3.2

final String result = toString(first);

return result;

}

// two or more elements

final StringBuilder buf = new StringBuilder(256); // Java default is 16, probably too small

if (first != null) {

buf.append(first);

}

while (iterator.hasNext()) {

if (separator != null) {

buf.append(separator);

}

final Object obj = iterator.next();

if (obj != null) {

buf.append(obj);

}

}

return buf.toString();

}

public static String toString(Object object) {

return object == null ? "" : object.toString();

}

public static String trim(final String str) {

return str == null ? null : str.trim();

}

/**

* 获取当前时间戳

*/

public static String getTimeStamp() {

return (System.currentTimeMillis() / 1000) + "";

}

}

wxapi包下

/**

* Created by zhang_dawn on  2019/8/18

* Descride:

*/

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {

private IWXAPI wxapi;

@Override

protected void onCreate( Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

wxapi = WXAPIFactory.createWXAPI(this,Constant.WECHAT_APPID);

wxapi.handleIntent(getIntent(),this);

}

@Override

protected void onNewIntent(Intent intent) {

super.onNewIntent(intent);

setIntent(intent);

wxapi.handleIntent(intent, this);

}

@Override

public void onReq(BaseReq req) {

}

@Override

public void onResp(BaseResp resp) {

Log.d("zjp", "onPayFinish, errCode = " + resp.errCode);// 支付结果码

//这块最好发个本地广播

if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {

int code = resp.errCode;

switch (code) {

case 0:

ToastUtils.show("支付成功");

break;

case -1:

finish();

// 支付失败 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等

ToastUtils.show("支付失败");

break;

case -2:

finish();

ToastUtils.show("支付取消");

break;

}

}

}

}

这样就可以顺利的支付了,成功的时候心情都好了一点,你遇到支付不成功的原因,评论出来,可以一块找找问题,另外需要支付宝支付的源码私信我

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值