項目中接入支付功能掖疮,支付寶一次過
唯獨這個微信,后臺說是前端自己加密(真坑爹)
如何接入微信支付就不說了颗祝,重點加密
客戶端微信加密
//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<String,String> 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 {
? ? /**
? ? * 喚醒微信支付 的所有參數(shù) 進行簽名
? ? *
? ? * @param parameters
? ? * @return
? ? */
? ? @SuppressWarnings("unchecked")
? ? public static String openWechatPaySign(Map<String, String> parameters, String key) {
? ? ? ? final Map<String, String> sordMap = new TreeMap<>(parameters);
? ? ? ? List<String> params = new ArrayList<>();
? ? ? ? for (Map.Entry<String, String> entry : sordMap.entrySet()) {
? ? ? ? ? ? params.add(entry.getKey() + "=" + entry.getValue());
? ? ? ? }
? ? ? ? params.add("key=" + key);
? ? ? ? String pararmStr = (String) join(params.iterator(), "&");
? ? ? ? Log.e("按照微信的簽名規(guī)則排好序的字符串---->", 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);// 支付結果碼
? ? ? ? ? ? ? ? //這塊最好發(fā)個本地廣播
? ? ? ? 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;
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
這樣就可以順利的支付了折汞,成功的時候心情都好了一點,你遇到支付不成功的原因盖腿,評論出來爽待,可以一塊找找問題,另外需要支付寶支付的源碼私信我