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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章