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;
}
}
一:在开发过程中一定和官方的字段相同注意大小写。
二:如果生成二维码扫描时提示原生支付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;
}
}
相关文章推荐
- JS判断是否在微信浏览器打开的简单实例(推荐)
- Android 仿微信 录音获取录音文件 和录音时间 录音动画和 播放动画
- Android破解微信获取聊天记录和通讯录信息(静态方式)
- 微信公众号 调用红包接口
- 升讯威微信营销系统开发实践:目录
- 公众号改名为"GeekerTalk"
- IOS 微信分享点击无反应(完美解决微信分享32K图片限制问题)
- 微信现任意代码执行漏洞 攻击者可获取完全控制权
- 微信多群直播技术如何点燃微营销
- 微信分销几大难题解决办法
- 这家医院,在微信上就能搞定“住院全流程”
- Ubuntu wine QQ 微信乱码
- 微信公众号开发中部分配置
- 微信只允许二级分销,否则封停账号,三级分销何去何从?
- H5 立方体小程序
- Html5 ABC小程序
- iOS开发支付集成之微信支付
- 微信公众号创建自定义菜单时提示40033错误
- 分享到微信微博空间等第三方平台的JS代码
- 腾讯出重拳 封禁数万个涉赌微信QQ账号