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

微信支付 进行统一下单 签名错误

2016-06-17 08:52 633 查看
微信支付 进行统一下单 签名错误,我在微信支付接口签名校验工具中验证通过,但是还是提示签名错误,我在

key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置

重新设置下密钥就可以了,微信坑爹啊

注意,这里的密钥是支付平台中的客户密钥,不是公众号的AppSecret(应用密钥)

Java代码:

public static void createPay(String openid) {

        String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";

        OrderReqBean reqBean = setOrderRequestBean(openid);

        String output = getOrderRequestXml(reqBean);

        System.out.println("==xml=="+output);

        String json = "";

        try {

            json = WeixinUtil.httpsRequest(url, "POST", output);

        } catch (Exception e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

        System.out.println("结果:" + json);

    }

    // 得到统一下单的xml

    private static String getOrderRequestXml(OrderReqBean reqBean) {

        SortedMap<Object, Object> param = new TreeMap<Object, Object>();

        param.put("appid", reqBean.getAppid());

        param.put("attach", reqBean.getAttach());

        param.put("body", reqBean.getBody());

        param.put("detail", reqBean.getDetail());

        param.put("device_info", reqBean.getDevice_info());

        param.put("mch_id", reqBean.getMch_id());

        param.put("nonce_str", reqBean.getNonce_str());

        param.put("notify_url", reqBean.getNotify_url());

        param.put("out_trade_no", reqBean.getOut_trade_no());

        param.put("openid", reqBean.getOpenid());

        param.put("spbill_create_ip", reqBean.getSpbill_create_ip());

        param.put("total_fee", reqBean.getTotal_fee());

        param.put("trade_type", reqBean.getTrade_type());

        param.put("sign", reqBean.getSign());

        

        return getRequestXml(param);

    }

    //把参数封装为xml

    private static String getRequestXml(SortedMap<Object, Object> params) {

        StringBuffer sb = new StringBuffer();

        sb.append("<xml>");

        Set<Entry<Object, Object>> es = params.entrySet();

        Iterator<Entry<Object, Object>> it = es.iterator();

        while (it.hasNext()) {

            Map.Entry<Object, Object> entry = (Map.Entry<Object, Object>) it

                    .next();

            String k = (String) entry.getKey();

            String v = (String) entry.getValue();

            if ("attach".equalsIgnoreCase(k) || "body".equalsIgnoreCase(k)) {

                sb.append("<" + k + ">" + "<![CDATA[" + v + "]]></" + k + ">");

            } else {

                sb.append("<" + k + ">" + v + "</" + k + ">");

            }

        }

        sb.append("</xml>");

        return sb.toString();

    }

    // 得到统一下单的参数

    private static OrderReqBean setOrderRequestBean(String openid) {

        OrderReqBean reqBean = new OrderReqBean();

        String appId = ConfUtil.getSysProperty("weixin.appId");

        String secret = ConfUtil.getSysProperty("weixin.apiKey");

        String mchId = ConfUtil.getSysProperty("weixin.mch_id");

        String ranStr = RandomStringUtils.randomAlphanumeric(31);

        reqBean.setAppid(appId);

        reqBean.setMch_id(mchId);

        reqBean.setAppSecret(secret);

        reqBean.setAttach("zhanjiang");

        reqBean.setBody("TestIpadMini16G");

        reqBean.setDetail("TestIpadMini16G");

        reqBean.setDevice_info("WEB");

        reqBean.setMch_id(mchId);

        reqBean.setNonce_str(ranStr);

        reqBean.setNotify_url("http://www.weixin.com/mobile/weixin/weixin_pay_result.jsp");

        reqBean.setOut_trade_no(getOutTradeNo());

        reqBean.setOpenid(openid);

        reqBean.setSpbill_create_ip("125.90.18.104");// SysContext.getClientIp()

        reqBean.setTotal_fee("1");

        reqBean.setTrade_type("JSAPI");

        return setSign(reqBean);

    }

    /**

     * 统一下单设置签名的方式

     *

     */

    private static OrderReqBean setSign(OrderReqBean reqBean) {

        StringBuilder sb = new StringBuilder();

        // sb.append("https://api.mch.weixin.qq.com/pay/unifiedorder?appid=");

        // 参数名ASCII码从小到大排序(字典序);

        sb.append("appid=");

        sb.append(reqBean.getAppid());

        sb.append("&attach=");

        sb.append(reqBean.getAttach());

        sb.append("&body=");

        sb.append(reqBean.getBody());

        sb.append("&detail=");

        sb.append(reqBean.getDetail());

        sb.append("&device_info=");

        sb.append(reqBean.getDevice_info());

        sb.append("&mch_id=");

        sb.append(reqBean.getMch_id());

        sb.append("&nonce_str=");

        sb.append(reqBean.getNonce_str());

        sb.append("¬ify_url=");

        sb.append(reqBean.getNotify_url());

        sb.append("&openid=");

        sb.append(reqBean.getOpenid());

        sb.append("&out_trade_no=");

        sb.append(reqBean.getOut_trade_no());

        sb.append("&spbill_create_ip=");

        sb.append(reqBean.getSpbill_create_ip());

        sb.append("&total_fee=");

        sb.append(reqBean.getTotal_fee());

        sb.append("&trade_type=");

        sb.append(reqBean.getTrade_type());

        sb.append("&key=");

        sb.append(reqBean.getAppSecret());

        

        System.out.println("===signUrl==="+sb.toString());

        String sign = MD5.GetMD5Code(sb.toString()).toUpperCase();

        reqBean.setSign(sign);

        return reqBean;

    }

    

    /**

     * 得到商户订单号

     *

     * @return

     */

    private static String getOutTradeNo() {

        Date date = new Date();

        long time = date.getTime();

        int ran = (int) (Math.random() * 900) + 100;

        return String.valueOf(time) + String.valueOf(ran);

    }

    public static void main(String[] args) {

        createPay("osoyExGrX-8888888888888888");

      

    }


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: