方式,Android 微信支付加密"/>
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;
}
}
}
}
这样就可以顺利的支付了,成功的时候心情都好了一点,你遇到支付不成功的原因,评论出来,可以一块找找问题,另外需要支付宝支付的源码私信我
更多推荐
android 微信加密方式,Android 微信支付加密
发布评论