abc_cainiaotengfei
abc_cainiaotengfei
2016-07-12 01:02
采纳率: 42.9%
浏览 5.4k
已采纳

微信支付在获得prepayid之后怎么再次签名

微信支付在获得prepayid之后怎么再次签名?
签名后应该调哪个接口发起支付?
java服务端

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • sony1218
    sony1218 2016-07-12 01:27
    已采纳

    public static String getPackage(WxPayDto tpWxPayDto) {

        String openId = tpWxPayDto.getOpenId();
        // 1 参数
        // 订单号
        String orderId = tpWxPayDto.getOrderId();
        // 附加数据 原样返回
        String attach = "";
        // 总金额以分为单位,不带小数点
        String totalFee = getMoney(tpWxPayDto.getTotalFee());
    
        // 订单生成的机器 IP
        String spbill_create_ip = tpWxPayDto.getSpbillCreateIp();
        // 这里notify_url是 支付完成后微信发给该链接信息,可以判断会员是否支付成功,改变订单状态等。
        String notify_url = notifyurl;
        String trade_type = "JSAPI";
    
        // ---必须参数
        // 商户号
        String mch_id = partner;
        // 随机字符串
        String nonce_str = getNonceStr();
    
        // 商品描述根据情况修改
        String body = tpWxPayDto.getBody();
    
        // 商户订单号
        String out_trade_no = orderId;
    
        SortedMap<String, String> packageParams = new TreeMap<String, String>();
        packageParams.put("appid", appid);
        packageParams.put("mch_id", mch_id);
        packageParams.put("nonce_str", nonce_str);
        packageParams.put("body", body);
        packageParams.put("attach", attach);
        packageParams.put("out_trade_no", out_trade_no);
    
        // 这里写的金额为1 分到时修改
        packageParams.put("total_fee", totalFee);
        packageParams.put("spbill_create_ip", spbill_create_ip);
        packageParams.put("notify_url", notify_url);
    
        packageParams.put("trade_type", trade_type);
        packageParams.put("openid", openId);
    
        RequestHandler reqHandler = new RequestHandler(null, null);
        reqHandler.init(appid, appsecret, partnerkey);
    
        String sign = reqHandler.createSign(packageParams);
        String xml = "<xml>" + "<appid>" + appid + "</appid>" + "<mch_id>"
                + mch_id + "</mch_id>" + "<nonce_str>" + nonce_str
                + "</nonce_str>" + "<sign>" + sign + "</sign>"
                + "<body><![CDATA[" + body + "]]></body>" 
                + "<out_trade_no>" + out_trade_no
                + "</out_trade_no>" + "<attach>" + attach + "</attach>"
                + "<total_fee>" + totalFee + "</total_fee>"
                + "<spbill_create_ip>" + spbill_create_ip
                + "</spbill_create_ip>" + "<notify_url>" + notify_url
                + "</notify_url>" + "<trade_type>" + trade_type
                + "</trade_type>" + "<openid>" + openId + "</openid>"
                + "</xml>";
        String prepay_id = "";
        String createOrderURL = "https://api.mch.weixin.qq.com/pay/unifiedorder";
    
    
        prepay_id = new GetWxOrderno().getPayNo(createOrderURL, xml);
    
        System.out.println("获取到的预支付ID:" + prepay_id);
    
    
        //获取prepay_id后,拼接最后请求支付所需要的package
    
        SortedMap<String, String> finalpackage = new TreeMap<String, String>();
        String timestamp = Sha1Util.getTimeStamp();
        String packages = "prepay_id="+prepay_id;
        finalpackage.put("appId", appid);  
        finalpackage.put("timeStamp", timestamp);  
        finalpackage.put("nonceStr", nonce_str);  
        finalpackage.put("package", packages);  
        finalpackage.put("signType", "MD5");
        //要签名
        String finalsign = reqHandler.createSign(finalpackage);
    
        String finaPackage = "\"appId\":\"" + appid + "\",\"timeStamp\":\"" + timestamp
        + "\",\"nonceStr\":\"" + nonce_str + "\",\"package\":\""
        + packages + "\",\"signType\" : \"MD5" + "\",\"paySign\":\""
        + finalsign + "\"";
    
        System.out.println("V3 jsApi package:"+finaPackage);
        return finaPackage;
    }
    public static void main(String[] args) {
    
        //微信支付jsApi
        WxPayDto tpWxPay = new WxPayDto();
        tpWxPay.setOpenId(openId);
        tpWxPay.setBody("商品信息");
        tpWxPay.setOrderId(getNonceStr());
        tpWxPay.setSpbillCreateIp("127.0.0.1");
        tpWxPay.setTotalFee("0.01");
        getPackage(tpWxPay);
    }
    
    点赞 评论
  • abc_cainiaotengfei
    abc_cainiaotengfei 2016-07-12 01:06

    网上有案例不过有很多参数我没有.案例:

    3.5 添加 prepayid 再次签名
    获取到 prepayid 后,将参数 appid、appkey、noncestr、package(注意:此处应置为 Sign=WXPay)、partnerid、prepayid、timestamp 签名后返回给 APP,签名方法跟 3.4 节
    app_signature 说明一致。得到参数列表如下,通过这些参数即可在客户端调起支付。
    {
    “appid”:“wxd930ea5d5a258f4f”, “noncestr”:“139042a4157a773f209847829d80894d”, “package”:“Sign=WXpay”;
    “partnerid”:“1900000109” “prepayid”:“1101000000140429eb40476f8896f4c9”, “sign”:“7ffecb600d7157c5aa49810d2d8f28bc2811827b”, “timestamp”:“1398746574”
    }
    

    总结下开发:

    先按照同一下单请求参数去获取prepay_id
    得到prepay_id, 参考上面的 3.5 添加 prepayid 再次签名
    
    点赞 评论
  • baidu_38207071
    baidu_38207071 2017-04-17 09:24

    请问 GetWxOrderno().getPayNo写的什么?

    点赞 评论

相关推荐