android 微信掃碼支付模式一生成二維碼 原生支付url參數錯誤


最近在寫微信掃碼支付生成二維碼,給大家分享一下,在說說在開發過程中的問題。歡迎吐槽。。

一:在開發過程中一定和官方的字段相同注意大小寫。

二:如果生成二維碼掃描時提示原生支付url參數錯誤,這就是你配置的字段有誤,一般是簽名的問題。保證前面和sign內容要一致。簽名生成算法簽名校驗工具

效驗方法:效驗時用自定義參數,把東西添加進去,會生成簽名,你可以複製在你url的sign的參數,來驗證是不是簽名的問題。

三:如果提示商戶後臺連接失敗,證明你生成的二維碼成功了,只是後臺的回調接口沒弄對。

如果還有什麼問題評論或私信。

/**
 * 微信支付
 * 
 * @author cheng
 * 
 */
public class WeChatPayActivity extends Activity {
	
	/**
	 * 二維碼url
	 */
	private String mUrl;
	/**
	 * 時間戳
	 */
	private long mTimestamp;
	/**
	 * 隨機字符串
	 */
	private String mRandom;
	/**
	 * 簽名
	 */
	private String sign;
	/**
	 * 必須參數(這個建議從服務器上獲取)
	 * (appid----微信分配的公衆賬號ID,mch_id---微信支付分配的商戶號,product_id---商戶定義的商品id或者訂單號,)
	 */
	private String appid = "xxxxx", mch_id = "xxxxx",
			product_id = "xxx";
	private TimeUtil mTimeUtil;//博客中有
	

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_we_chat_pay);
		initView();
		init();
		getUrl();
	}

	private void initView() {
		// TODO Auto-generated method stub
		

	}

	private void init() {
		// TODO Auto-generated method stub

		mTimeUtil = new TimeUtil();
		// 時間戳--十位
		mTimestamp = mTimeUtil.getTimestamp(mTimeUtil.getNowTime()) / 1000;
		// 隨機數
		mRandom = getRandomString();
		sign = createSign();

	}

	/**
	 * 生成二維碼url
	 * 
	 * @return
	 */
	private String getUrl() {

		// weixin://wxpay/bizpayurl?sign=XXXXX&appid=XXXXX&mch_id=XXXXX&product_id=XXXXXX&time_stamp=XXXXXX&nonce_str=XXXXX
		mUrl = "weixin://wxpay/bizpayurl?" + "sign=" + sign + "&appid=" + appid
				+ "&mch_id=" + mch_id + "&product_id=" + product_id
				+ "&time_stamp=" + mTimestamp + "&nonce_str=" + mRandom;
		System.out.println("======mUrl=========" + mUrl);
		return mUrl;
	}

	/**
	 * 生成隨機數
	 * 
	 * @return
	 */
	private String getRandomString() {
		String randomNumber = "";
		// 生成純數字隨機數(自己任選一種)
		// int random1 = (int) (Math.random() * 1000000000);
		// randomNumber = Integer.toString(random1);

		// 生成數字和字母結合的隨機字符串(自己任選一種)
		StringBuffer buffer = new StringBuffer(
				"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
		StringBuffer sb = new StringBuffer();
		Random random = new Random();
		int range = buffer.length();
		for (int i = 0; i < 32; i++) {
			sb.append(buffer.charAt(random.nextInt(range)));
		}
		randomNumber = sb.toString();
		return randomNumber;
	}

	

	private String createSign() {
		// 第一步 參數名ASCII碼從小到大排序(字典序)
		SortedMap<String, String> packageParams = new TreeMap<String, String>();
		packageParams.put("appid", appid);
		packageParams.put("mch_id", mch_id);
		packageParams.put("nonce_str", mRandom);
		packageParams.put("product_id", product_id);
		packageParams.put("time_stamp", mTimestamp + "");
		StringBuffer sb = new StringBuffer();
		Set es = packageParams.entrySet();// 字典序
		Iterator it = es.iterator();
		while (it.hasNext()) {
			Map.Entry entry = (Map.Entry) it.next();
			String k = (String) entry.getKey();
			String v = (String) entry.getValue();
			// 爲空不參與簽名、參數名區分大小寫
			if (null != v && !"".equals(v) && !"sign".equals(k)
					&& !"key".equals(k)) {
				sb.append(k + "=" + v + "&");
			}
		}

		// 第二步
		// 拼接key,key設置路徑:微信商戶平臺(pay.weixin.qq.com)-->賬戶設置-->API安全-->密鑰設置(32位)
		sb.append("key=" + "xxxxxxxxxx");
		sign = Md5.encode(sb.toString()).toUpperCase();// MD5加密
		return sign;
	}
}

發佈了38 篇原創文章 · 獲贊 60 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章