您的位置:首页 > 移动开发 > 微信开发

android 微信扫码支付模式一生成二维码 原生支付url参数错误

2016-08-24 09:52 666 查看
最近在写微信扫码支付生成二维码,给大家分享一下,在说说在开发过程中的问题。欢迎吐槽。。

一:在开发过程中一定和官方的字段相同注意大小写。

二:如果生成二维码扫描时提示原生支付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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: