调用微信小程序统一下单接口

最近刚接触微信小程序项目,踩了几个坑,以此记录一下

1、微信小程序需要绑定商户 【mch_id=商户号】

2、调用统一接口部分代码

public Map<String,String> pay(){
        //微信统一下单URL
        String payUrl="https://api.mch.weixin.qq.com/pay/unifiedorder";

        Map<String, String> map = new HashMap<>();
        map.put("appid", ""); //小程序appid
        map.put("body", ""); //商品描述
        map.put("mch_id", ""); //商户号
        map.put("nonce_str", ""); //32位随机码
        map.put("out_trade_no", ""); //订单号
        map.put("openid", ""); //小程序用户openid
        map.put("total_fee", "");//费用
        map.put("spbill_create_ip", ""); //ip地址
        map.put("notify_url", "");//回调URL
        map.put("trade_type", "JSAPI"); //支付方式

        //使用ASKII码进行排序
        String stringA = formatUrlMap(map, false, false);

       //加上+key,并转换成大写
       String sign = MD5Util.toMD5String(stringA+"&key=").toUpperCase();

       String xml = "<xml>" + "<appid>"
                +appid + "</appid>"
                + "<body>"+body+"</body>"
                + "<mch_id>" + mchid + "</mch_id>"
                + "<nonce_str>" + nonceStr + "</nonce_str>"
                + "<notify_url>" + url+ "</notify_url>"
                + "<openid>" + openId + "</openid>"
                + "<out_trade_no>" + orderid + "</out_trade_no>"
                + "<spbill_create_ip>"+ipAds+"</spbill_create_ip>"
                + "<total_fee>" + money + "</total_fee>"
                + "<trade_type>JSAPI</trade_type>"
                + "<sign>" + sign + "</sign>"
                + "</xml>";
        
        //获得返回结果
        String result = HttpClass.httpRequest(payUrl, "POST", xml);

        //解析字符串 获取prepay_id
        //将参数返回给前端小程序
        return map;
}

*此处注意:上面签名的字符串个数必须要和 XML的 个数,名称一一对应,不然会返回 “签名错误

/** 
     * 方法用途: 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序),并且生成url参数串 
     * 实现步骤: 
     * @param paraMap   要排序的Map对象 
     * @param urlEncode   是否需要URLENCODE 
     * @param keyToLower    是否需要将Key转换为全小写 
     *            true:key转化成小写,false:不转化 
     * @return 
     */
private static String formatUrlMap(Map<String, String> paraMap, boolean urlEncode, boolean keyToLower){  

        String buff = "";  
        Map<String, String> tmpMap = paraMap;  
        try{  
            List<Map.Entry<String, String>> infoIds = new ArrayList<Map.Entry<String, String>>(tmpMap.entrySet());  

            // 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)  
            Collections.sort(infoIds, new Comparator<Map.Entry<String, String>>(){  

                @Override  
                public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2){  
                 return (o1.getKey()).toString().compareTo(o2.getKey());  
                }  
            });  

            // 构造URL 键值对的格式  
            StringBuilder buf = new StringBuilder();  

            for (Map.Entry<String, String> item : infoIds){  

                if (StringUtils.isNotBlank(item.getKey())){  

                    String key = item.getKey();  
                    String val = item.getValue();  

                    if (urlEncode){  
                        val = URLEncoder.encode(val, "utf-8");  
                    }  

                    if (keyToLower){  
                        buf.append(key.toLowerCase() + "=" + val);  
                    } else {  
                        buf.append(key + "=" + val);  
                    }  

                    buf.append("&");  
                } 
            }  

            buff = buf.toString();  
            if (buff.isEmpty() == false) {  
                buff = buff.substring(0, buff.length() - 1);  
            }  

        } catch (Exception e){  
           return null;  
        }  

        return buff;  
    }
/**  
     * @param requestUrl请求地址  
     * @param requestMethod请求方法  
     * @param outputStr参数  
     */   
    public static String httpRequest(String requestUrl,String requestMethod,String outputStr){   
        // 创建SSLContext   
        StringBuffer buffer = null;   
        try{   
        URL url = new URL(requestUrl);   
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();   
        conn.setRequestMethod(requestMethod);   
        conn.setDoOutput(true);   
        conn.setDoInput(true);   
        conn.connect();   
        //往服务器端写内容   
        if(null !=outputStr){   
            OutputStream os=conn.getOutputStream();   
            os.write(outputStr.getBytes("utf-8"));   
            os.close();   
        }   
        // 读取服务器端返回的内容   
        InputStream is = conn.getInputStream();   
        InputStreamReader isr = new InputStreamReader(is, "utf-8");   
        BufferedReader br = new BufferedReader(isr);   
        buffer = new StringBuffer();   
        String line = null;   
        while ((line = br.readLine()) != null) {   
        buffer.append(line);   
        }   
        br.close();
        }catch(Exception e){   
            e.printStackTrace();   
        }
        return buffer.toString();
    }

 

 

微信支付接口签名校验工具:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1
微信公众平台支付接口调试工具:https://pay.weixin.qq.com/wiki/tools/signverify/
中间有借鉴其他人的代码

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 微信小程序统一代码如下所示: ```javascript wx.requestPayment({ timeStamp: '', // 时间戳 nonceStr: '', // 随机字符串 package: '', // 统一接口返回的 prepay_id 参数值,格式如:prepay_id=*** signType: 'MD5', // 签名算法,目前支持 MD5 paySign: '', // 签名 success: function (res) { // 支付成功 }, fail: function (res) { // 支付失败 } }); ``` 需要注意的是,调用此代码前需要先调用微信支付接口进行订支付的统一操作,获取到 prepay_id 参数值后才能使用此代码进行支付。同时,还需要对参数进行正确的填写和签名处理,确保支付的安全性和准确性。 ### 回答2: 微信小程序统一是指通过调用微信支付接口实现用户在小程序内进行支付的功能。下面是一个示例的微信小程序统一代码: 1. 在小程序中创建一个按钮,当用户点击按钮时触发下操作。 ``` <view> <button bindtap="unifiedOrder">下</button> </view> ``` 2. 在小程序的.js文件中编写下函数unifiedOrder,该函数会调用微信支付接口进行统一。 ``` Page({ unifiedOrder: function() { wx.request({ url: 'https://api.mch.weixin.qq.com/pay/unifiedorder', method: 'POST', data: { appid: '你的小程序APPID', mch_id: '你的商户号', nonce_str: '随机字符串', sign: '签名', body: '商品描述', out_trade_no: '商户订号', total_fee: '订金额', spbill_create_ip: '终端IP', notify_url: '支付结果通知地址', trade_type: '交易类型' }, success: function(res) { // 支付接口调用成功,获取prepay_id var prepay_id = res.data.prepay_id; // 调用微信小程序支付接口 wx.requestPayment({ timeStamp: '', nonceStr: '', package: '', signType: '', paySign: '', success: function(res) { // 支付成功回调函数 }, fail: function(res) { // 支付失败回调函数 } }); }, fail: function(res) { // 支付接口调用失败 } }); } }); ``` 以上是一个简微信小程序统一代码示例,具体参数的填写需要根据自己的实际情况进行修改。另外,该示例只包含了下接口和支付接口调用,如果需要进行更复杂的逻辑处理,还需要根据具体需求进行代码扩展。 ### 回答3: 微信小程序统一是指通过微信支付接口实现用户在小程序中购买商品或服务时的支付功能。下面是一个简的示例代码,实现微信小程序统一的流程: 1. 在小程序的后台服务器上创建一个接口,用于处理下请求。这个接口需要接收以下参数:商品名称、商品总价、用户id等。 ```javascript // 假设接口地址为 /unified_order const app = getApp(); Page({ data: { goodsName: "商品名称", totalPrice: 100, userId: "用户id", }, payOrder: function() { wx.request({ url: `${app.globalData.serverUrl}/unified_order`, method: 'POST', data: { goodsName: this.data.goodsName, totalPrice: this.data.totalPrice, userId: this.data.userId, }, success: function(res) { // 获取prepay_id const prepayId = res.data.prepayId; // 调用微信支付API wx.requestPayment({ timeStamp: res.data.timeStamp, nonceStr: res.data.nonceStr, package: res.data.package, signType: res.data.signType, paySign: res.data.paySign, success: function(res) { // 支付成功回调函数 }, fail: function(res) { // 支付失败回调函数 } }); }, fail: function(res) { // 下失败回调函数 } }); }, }); ``` 2. 在后台服务器接口中,调用微信接口实现统一,并返回给小程序预支付信息(如prepayId、时间戳、随机字符串、签名等)。 3. 小程序前端收到预支付信息后,调用微信支付API进行支付。支付成功后,可以进行相应的后续处理。 以上是一个简微信小程序统一的代码示例,具体实现还需根据实际需求和接口文档进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值