微信小程序支付(java后端)


第一步

进入小程序,下单,请求下单支付,调用小程序登录API来获取Openid(https://mp.weixin.qq.com/debug/w ... .html#wxloginobject),生成商户订单,这些都是在小程序端完成的业务。

小程序端代码 
// pages/pay/pay.js 
var app = getApp(); 
Page({ 
    data: {}, 
    onLoad: function (options) { 
        // 页面初始化 options为页面跳转所带来的参数 
    }, 
    /* 微信支付 */ 
    wxpay: function () { 
        var that = this 
        //登陆获取code 
        wx.login({ 
            success: function (res) { 
                console.log(res.code) 
                //获取openid 
                that.getOpenId(res.code) 
            } 
        }); 
    }, 
    getOpenId: function (code) { 
        var that = this; 
        wx.request({ 
            url: "https://api.weixin.qq.com/sns/jscode2session?appid=wxa142513e524e496c&secret=5d6a7d86048884e7c60f84f7aa85253c&js_code=" + code + "&grant_type=authorization_code", 
            data: {}, 
            method: ‘GET‘, 
            success: function (res) { 
                console.log(‘返回openId‘) 
                console.log(res.data) 
                that.generateOrder(res.data.openid) 
            }, 
            fail: function () { 
                // fail 
            }, 
            complete: function () { 
                // complete 
            } 
        }) 
    }, 
    /**生成商户订单 */ 
    generateOrder: function (openid) { 
        var that = this 
        //统一支付 
        wx.request({ 
            url: ‘http://localhost:8070/RMS/pay_pay.action‘, 
            method: ‘GET‘, 
            data: { 
                total_fee: ‘5‘, 
                body: ‘支付测试‘, 
                attach:‘真假酒水‘ 
            }, 
            success: function (res) { 
                console.log(res) 
                var pay = res.data 
                //发起支付 
                var timeStamp = pay[0].timeStamp; 
                console.log("timeStamp:"+timeStamp) 
                var packages = pay[0].package; 
                console.log("package:"+packages) 
                var paySign = pay[0].paySign; 
                console.log("paySign:"+paySign) 
                var nonceStr = pay[0].nonceStr; 
                 console.log("nonceStr:"+nonceStr) 
                var param = { "timeStamp": timeStamp, "package": packages, "paySign": paySign, "signType": "MD5", "nonceStr": nonceStr }; 
                that.pay(param) 
            }, 
        }) 
    }, 
    /* 支付   */ 
    pay: function (param) { 
        console.log("支付") 
        console.log(param) 
        wx.requestPayment({ 
            timeStamp: param.timeStamp, 
            nonceStr: param.nonceStr, 
            package: param.package, 
            signType: param.signType, 
            paySign: param.paySign, 
            success: function (res) { 
                // success 
                console.log("支付") 
                console.log(res) 
                wx.navigateBack({ 
                    delta: 1, // 回退前 delta(默认为1) 页面 
                    success: function (res) { 
                        wx.showToast({ 
                            title: ‘支付成功‘, 
                            icon: ‘success‘, 
                            duration: 2000 
                        }) 
                    }, 
                    fail: function () { 
                        // fail 
                    }, 
                    complete: function () { 
                        // complete 
                    } 
                }) 
            }, 
            fail: function (res) { 
                // fail 
                console.log("支付失败") 
                console.log(res) 
            }, 
            complete: function () { 
                // complete 
                console.log("pay complete") 
            } 
        }) 
    } 
}) 
复制代码 
第二步

调用支付统一下单API来获取prepay_id,并将小程序调起支付数据需要签名的字段appId,timeStamp,nonceStr,package再次签名(https://pay.weixin.qq.com/wiki/d ... ter=7_7&index=3)

后台代码 
package cn.it.shop.action; 
import java.io.ByteArrayInputStream; 
import java.io.InputStream; 
import java.io.UnsupportedEncodingException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import org.dom4j.Document; 
import org.dom4j.DocumentException; 
import org.dom4j.Element; 
import org.dom4j.io.SAXReader; 
import cn.it.shop.util.MessageUtil; 
import cn.it.shop.util.PayUtil; 
import cn.it.shop.util.PaymentPo; 
import cn.it.shop.util.UUIDHexGenerator; 
import net.sf.json.JSONArray; 
import net.sf.json.JSONObject; 
/** 
* @author 
* @version 创建时间:2017年1月21日 下午4:59:03 
* 小程序端请求的后台action,返回签名后的数据传到前台 
*/ 
public class PayAction { 
    private String total_fee;//总金额 
    private String body;//商品描述 
    private String detail;//商品详情    
    private String attach;//附加数据 
    private String time_start;//交易起始时间 
    private String time_expire;//交易结束时间 
    private String openid;//用户标识 
    private JSONArray jsonArray=new JSONArray(); 
    public String pay() throws UnsupportedEncodingException, DocumentException{ 
         body = new String(body.getBytes("UTF-8"),"ISO-8859-1");  
        String appid = "替换为自己的小程序ID";//小程序ID 
        String mch_id = "替换为自己的商户号";//商户号 
        String nonce_str = UUIDHexGenerator.generate();//随机字符串 
        String today = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); 
        String code = PayUtil.createCode(8); 
        String out_trade_no = mch_id+today+code;//商户订单号 
        String spbill_create_ip = "替换为自己的终端IP";//终端IP 
        String notify_url = "http://www.weixin.qq.com/wxpay/pay.php";//通知地址 
        String trade_type = "JSAPI";//交易类型  
        String openid="替换为用户的openid";//用户标识 
        /**/ 
        PaymentPo paymentPo = new PaymentPo(); 
        paymentPo.setAppid(appid); 
        paymentPo.setMch_id(mch_id); 
        paymentPo.setNonce_str(nonce_str); 
        String newbody=new String(body.getBytes("ISO-8859-1"),"UTF-8");//以utf-8编码放入paymentPo,微信支付要求字符编码统一采用UTF-8字符编码 
        paymentPo.setBody(newbody); 
        paymentPo.setOut_trade_no(out_trade_no); 
        paymentPo.setTotal_fee(total_fee); 
        paymentPo.setSpbill_create_ip(spbill_create_ip); 
        paymentPo.setNotify_url(notify_url); 
        paymentPo.setTrade_type(trade_type); 
        paymentPo.setOpenid(openid); 
        // 把请求参数打包成数组 
        Map sParaTemp = new HashMap(); 
        sParaTemp.put("appid", paymentPo.getAppid()); 
        sParaTemp.put("mch_id", paymentPo.getMch_id()); 
        sParaTemp.put("nonce_str", paymentPo.getNonce_str()); 
        sParaTemp.put("body",  paymentPo.getBody()); 
        sParaTemp.put("out_trade_no", paymentPo.getOut_trade_no()); 
        sParaTemp.put("total_fee",paymentPo.getTotal_fee()); 
        sParaTemp.put("spbill_create_ip", paymentPo.getSpbill_create_ip()); 
        sParaTemp.put("notify_url",paymentPo.getNotify_url()); 
        sParaTemp.put("trade_type", paymentPo.getTrade_type()); 
        sParaTemp.put("openid", paymentPo.getOpenid()); 
        // 除去数组中的空值和签名参数 
        Map sPara = PayUtil.paraFilter(sParaTemp); 
        String prestr = PayUtil.createLinkString(sPara); // 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串 
        String key = "&key=替换为商户支付密钥"; // 商户支付密钥 
        //MD5运算生成签名 
        String mysign = PayUtil.sign(prestr, key, "utf-8").toUpperCase(); 
        paymentPo.setSign(mysign); 
        //打包要发送的xml 
        String respXml = MessageUtil.messageToXML(paymentPo); 
        // 打印respXml发现,得到的xml中有“__”不对,应该替换成“_” 
        respXml = respXml.replace("__", "_"); 
        String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";//统一下单API接口链接 
        String param = respXml; 
        //String result = SendRequestForUrl.sendRequest(url, param);//发起请求 
        String result =PayUtil.httpRequest(url, "POST", param); 
        // 将解析结果存储在HashMap中 
        Map map = new HashMap(); 
         InputStream in=new ByteArrayInputStream(result.getBytes());  
        // 读取输入流 
        SAXReader reader = new SAXReader(); 
        Document document = reader.read(in); 
        // 得到xml根元素 
        Element root = document.getRootElement(); 
        // 得到根元素的所有子节点 
        @SuppressWarnings("unchecked") 
        List elementList = root.elements(); 
        for (Element element : elementList) { 
            map.put(element.getName(), element.getText()); 
        } 
        // 返回信息 
        String return_code = map.get("return_code");//返回状态码 
        String return_msg = map.get("return_msg");//返回信息 
        System.out.println("return_msg"+return_msg); 
        JSONObject JsonObject=new JSONObject() ; 
        if(return_code=="SUCCESS"||return_code.equals(return_code)){ 
            // 业务结果 
            String prepay_id = map.get("prepay_id");//返回的预付单信息 
            String nonceStr=UUIDHexGenerator.generate(); 
            JsonObject.put("nonceStr", nonceStr); 
            JsonObject.put("package", "prepay_id="+prepay_id); 
            Long timeStamp= System.currentTimeMillis()/1000; 
            JsonObject.put("timeStamp", timeStamp+""); 
            String stringSignTemp = "appId="+appid+"&nonceStr=" + nonceStr + "&package=prepay_id=" + prepay_id+ "&signType=MD5&timeStamp=" + timeStamp; 
            //再次签名 
            String paySign=PayUtil.sign(stringSignTemp, "&key=替换为自己的密钥", "utf-8").toUpperCase(); 
            JsonObject.put("paySign", paySign); 
            jsonArray.add(JsonObject); 
        } 
        return "pay"; 
    } 
    public String getTotal_fee() { 
        return total_fee; 
    } 
    public void setTotal_fee(String total_fee) { 
        this.total_fee = total_fee; 
    } 
    public String getBody() { 
        return body; 
    } 
    public void setBody(String body) { 
        this.body = body; 
    } 
    public JSONArray getJsonArray() { 
        return jsonArray; 
    } 
    public void setJsonArray(JSONArray jsonArray) { 
        this.jsonArray = jsonArray; 
    } 
    public String getDetail() { 
        return detail; 
    } 
    public void setDetail(String detail) { 
        this.detail = detail; 
    } 
    public String getAttach() { 
        return attach; 
    } 
    public void setAttach(String attach) { 
        this.attach = attach; 
    } 
    public String getTime_start() { 
        return time_start; 
    } 
    public void setTime_start(String time_start) { 
        this.time_start = time_start; 
    } 
    public String getTime_expire() { 
        return time_expire; 
    } 
    public void setTime_expire(String time_expire) { 
        this.time_expire = time_expire; 
    } 
    public String getOpenid() { 
        return openid; 
    } 
    public void setOpenid(String openid) { 
        this.openid = openid; 
    } 

复制代码 
后台业务逻辑涉及到的工具类及参数封装类 
MessageUtil 
package cn.it.shop.util; 
import java.io.IOException; 
import java.io.Writer; 
import java.util.HashMap; 
import java.util.List; 
import javax.servlet.http.HttpServletRequest; 
import org.dom4j.Document; 
import org.dom4j.Element; 
import org.dom4j.io.SAXReader; 
import com.thoughtworks.xstream.XStream; 
import com.thoughtworks.xstream.core.util.QuickWriter; 
import com.thoughtworks.xstream.io.HierarchicalStreamWriter; 
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter; 
import com.thoughtworks.xstream.io.xml.XppDriver; 
public class MessageUtil { 
    public static HashMap parseXML(HttpServletRequest request) throws Exception, IOException{ 
        HashMap map=new HashMap(); 
        // 通过IO获得Document 
        SAXReader reader = new SAXReader(); 
        Document doc = reader.read(request.getInputStream()); 
        //得到xml的根节点 
        Element root=doc.getRootElement(); 
        recursiveParseXML(root,map); 
        return map; 
    } 
    private static void recursiveParseXML(Element root,HashMap map){ 
        //得到根节点的子节点列表 
        List elementList=root.elements(); 
        //判断有没有子元素列表 
        if(elementList.size()==0){ 
            map.put(root.getName(), root.getTextTrim()); 
        } 
        else{ 
            //遍历 
            for(Element e:elementList){ 
                recursiveParseXML(e,map); 
            } 
        } 
    } 
    private static XStream xstream = new XStream(new XppDriver() { 
        public HierarchicalStreamWriter createWriter(Writer out) { 
            return new PrettyPrintWriter(out) { 
                // 对所有xml节点都增加CDATA标记 
                boolean cdata = true; 
                public void startNode(String name, Class clazz) { 
                    super.startNode(name, clazz); 
                } 
                protected void writeText(QuickWriter writer, String text) { 
                    if (cdata) { 
                        writer.write("                        writer.write(text); 
                        writer.write("]]>"); 
                    } else { 
                        writer.write(text); 
                    } 
                } 
            }; 
        } 
    }); 
    public static String messageToXML(PaymentPo paymentPo){ 
        xstream.alias("xml",PaymentPo.class); 
        return xstream.toXML(paymentPo); 
    } 

PaymentPo//封装支付参数实体 
package cn.it.shop.util; 
/** 
* @author 
* @version 创建时间:2017年1月21日 下午4:20:52 
* 类说明 
*/ 
public class PaymentPo { 
    private String appid;//小程序ID 
    private String mch_id;//商户号 
    private String device_info;//设备号 
    private String nonce_str;//随机字符串 
    private String sign;//签名 
    private String body;//商品描述  
    private String detail;//商品详情    
    private String attach;//附加数据 
    private String out_trade_no;//商户订单号 
    private String fee_type;//货币类型 
    private String spbill_create_ip;//终端IP 
    private String time_start;//交易起始时间 
    private String time_expire;//交易结束时间 
    private String goods_tag;//商品标记 
    private String total_fee;//总金额 
    private String notify_url;//通知地址    
    private String trade_type;//交易类型    
    private String limit_pay;//指定支付方式 
    private String openid;//用户标识 
    public String getAppid() { 
        return appid; 
    } 
    public void setAppid(String appid) { 
        this.appid = appid; 
    } 
    public String getMch_id() { 
        return mch_id; 
    } 
    public void setMch_id(String mch_id) { 
        this.mch_id = mch_id; 
    } 
    public String getNonce_str() { 
        return nonce_str; 
    } 
    public void setNonce_str(String nonce_str) { 
        this.nonce_str = nonce_str; 
    } 
    public String getSign() { 
        return sign; 
    } 
    public void setSign(String sign) { 
        this.sign = sign; 
    } 
    public String getBody() { 
        return body; 
    } 
    public void setBody(String body) { 
        this.body = body; 
    } 
    public String getOut_trade_no() { 
        return out_trade_no; 
    } 
    public void setOut_trade_no(String out_trade_no) { 
        this.out_trade_no = out_trade_no; 
    } 
    public String getTotal_fee() { 
        return total_fee; 
    } 
    public void setTotal_fee(String total_fee) { 
        this.total_fee = total_fee; 
    } 
    public String getNotify_url() { 
        return notify_url; 
    } 
    public void setNotify_url(String notify_url) { 
        this.notify_url = notify_url; 
    } 
    public String getTrade_type() { 
        return trade_type; 
    } 
    public void setTrade_type(String trade_type) { 
        this.trade_type = trade_type; 
    } 
    public String getOpenid() { 
        return openid; 
    } 
    public void setOpenid(String openid) { 
        this.openid = openid; 
    } 
    public String getSpbill_create_ip() { 
        return spbill_create_ip; 
    } 
    public void setSpbill_create_ip(String spbill_create_ip) { 
        this.spbill_create_ip = spbill_create_ip; 
    } 
    public String getDevice_info() { 
        return device_info; 
    } 
    public void setDevice_info(String device_info) { 
        this.device_info = device_info; 
    } 
    public String getDetail() { 
        return detail; 
    } 
    public void setDetail(String detail) { 
        this.detail = detail; 
    } 
    public String getAttach() { 
        return attach; 
    } 
    public void setAttach(String attach) { 
        this.attach = attach; 
    } 
    public String getFee_type() { 
        return fee_type; 
    } 
    public void setFee_type(String fee_type) { 
        this.fee_type = fee_type; 
    } 
    public String getTime_start() { 
        return time_start; 
    } 
    public void setTime_start(String time_start) { 
        this.time_start = time_start; 
    } 
    public String getTime_expire() { 
        return time_expire; 
    } 
    public void setTime_expire(String time_expire) { 
        this.time_expire = time_expire; 
    } 
    public String getGoods_tag() { 
        return goods_tag; 
    } 
    public void setGoods_tag(String goods_tag) { 
        this.goods_tag = goods_tag; 
    } 
    public String getLimit_pay() { 
        return limit_pay; 
    } 
    public void setLimit_pay(String limit_pay) { 
        this.limit_pay = limit_pay; 
    } 

PayUtil 
package cn.it.shop.util; 
import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.UnsupportedEncodingException; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import org.apache.commons.codec.digest.DigestUtils; 
/** 
* @author 
* @version 创建时间:2017年1月17日 下午7:46:29 类说明 
*/ 
public class PayUtil { 
    /** 
     * 签名字符串 
     * @param text需要签名的字符串 
     * @param key 密钥 
     * @param input_charset编码格式 
     * @return 签名结果 
     */ 
    public static String sign(String text, String key, String input_charset) { 
        text = text + key; 
        return DigestUtils.md5Hex(getContentBytes(text, input_charset)); 
    } 
    /** 
     * 签名字符串 
     *  @param text需要签名的字符串 
     * @param sign 签名结果 
     * @param key密钥 
     * @param input_charset 编码格式 
     * @return 签名结果 
     */ 
    public static boolean verify(String text, String sign, String key, String input_charset) { 
        text = text + key; 
        String mysign = DigestUtils.md5Hex(getContentBytes(text, input_charset)); 
        if (mysign.equals(sign)) { 
            return true; 
        } else { 
            return false; 
        } 
    } 
    /** 
     * @param content 
     * @param charset 
     * @return 
     * @throws SignatureException 
     * @throws UnsupportedEncodingException 
     */ 
    public static byte[] getContentBytes(String content, String charset) { 
        if (charset == null || "".equals(charset)) { 
            return content.getBytes(); 
        } 
        try { 
            return content.getBytes(charset); 
        } catch (UnsupportedEncodingException e) { 
            throw new RuntimeException("MD5签名过程◇◇现错误,指定的编码集不对,您目前指定的编码集是:" + charset); 
        } 
    } 
    /** 
     * 生成6位或10位随机数 param codeLength(多少位) 
     * @return 
     */ 
    public static String createCode(int codeLength) { 
        String code = ""; 
        for (int i = 0; i < codeLength; i++) { 
            code += (int) (Math.random() * 9); 
        } 
        return code; 
    } 
    private static boolean isValidChar(char ch) { 
        if ((ch >= ‘0‘ && ch <= ‘9‘) || (ch >= ‘A‘ && ch <= ‘Z‘) || (ch >= ‘a‘ && ch <= ‘z‘)) 
            return true; 
        if ((ch >= 0x4e00 && ch <= 0x7fff) || (ch >= 0x8000 && ch <= 0x952f)) 
            return true;// 简体中文汉字编码 
        return false; 
    } 
    /** 
     * 除去数组中的空值和签名参数 
     * @param sArray 签名参数组 
     * @return 去掉空值与签名参数后的新签名参数组 
     */ 
    public static Map paraFilter(Map sArray) { 
        Map result = new HashMap(); 
        if (sArray == null || sArray.size() <= 0) { 
            return result; 
        } 
        for (String key : sArray.keySet()) { 
            String value = sArray.get(key); 
            if (value == null || value.equals("") || key.equalsIgnoreCase("sign") 
                    || key.equalsIgnoreCase("sign_type")) { 
                continue; 
            } 
            result.put(key, value); 
        } 
        return result; 
    } 
    /** 
     * 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串 
     * @param params 需要排序并参与字符拼接的参数组 
     * @return 拼接后字符串 
     */ 
    public static String createLinkString(Map params) { 
        List keys = new ArrayList(params.keySet()); 
        Collections.sort(keys); 
        String prestr = ""; 
        for (int i = 0; i < keys.size(); i++) { 
            String key = keys.get(i); 
            String value = params.get(key); 
            if (i == keys.size() - 1) {// 拼接时,不包括最后一个&字符 
                prestr = prestr + key + "=" + value; 
            } else { 
                prestr = prestr + key + "=" + value + "&"; 
            } 
        } 
        return prestr; 
    } 
    /** 
     * 
     * @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); 
        } 
        }catch(Exception e){ 
            e.printStackTrace(); 
        } 
        return buffer.toString(); 
        }   
    public static String urlEncodeUTF8(String source){ 
        String result=source; 
        try { 
            result=java.net.URLEncoder.encode(source, "UTF-8"); 
        } catch (UnsupportedEncodingException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
        } 
        return result; 
    } 

UUIDHexGenerator 
package cn.it.shop.util; 
import java.net.InetAddress; 
/** 
* @author 
* @version 创建时间:2017年1月17日 下午7:45:06 类说明 
*/ 
public class UUIDHexGenerator { 
    private static String sep = ""; 
    private static final int IP; 
    private static short counter = (short) 0; 
    private static final int JVM = (int) (System.currentTimeMillis() >>> 
    private static UUIDHexGenerator uuidgen = new UUIDHexGenerator(); 
    static { 
        int ipadd; 
        try { 
            ipadd = toInt(InetAddress.getLocalHost().getAddress()); 
        } catch (Exception e) { 
            ipadd = 0; 
        } 
        IP = ipadd; 
    } 
    public static UUIDHexGenerator getInstance() { 
        return uuidgen; 
    } 
    public static int toInt(byte[] bytes) { 
        int result = 0; 
        for (int i = 0; i < 4; i++) { 
            result = (result <<  - Byte.MIN_VALUE + (int) bytes; 
        } 
        return result; 
    } 
    protected static String format(int intval) { 
        String formatted = Integer.toHexString(intval); 
        StringBuffer buf = new StringBuffer("00000000"); 
        buf.replace(8 - formatted.length(), 8, formatted); 
        return buf.toString(); 
    } 
    protected static String format(short shortval) { 
        String formatted = Integer.toHexString(shortval); 
        StringBuffer buf = new StringBuffer("0000"); 
        buf.replace(4 - formatted.length(), 4, formatted); 
        return buf.toString(); 
    } 
    protected static int getJVM() { 
        return JVM; 
    } 
    protected synchronized static short getCount() { 
        if (counter < 0) { 
            counter = 0; 
        } 
        return counter++; 
    } 
    protected static int getIP() { 
        return IP; 
    } 
    protected static short getHiTime() { 
        return (short) (System.currentTimeMillis() >>> 32); 
    } 
    protected static int getLoTime() { 
        return (int) System.currentTimeMillis(); 
    } 
    public static String generate() { 
        return new StringBuffer(36).append(format(getIP())).append(sep).append(format(getJVM())).append(sep) 
                .append(format(getHiTime())).append(sep).append(format(getLoTime())).append(sep) 
                .append(format(getCount())).toString(); 
    } 
    /** 
     * @param args 
     */ 
    public static void main(String[] args) { 
        String id=""; 
        UUIDHexGenerator uuid = UUIDHexGenerator.getInstance(); 
        /* 
        for (int i = 0; i < 100; i++) { 
            id = uuid.generate(); 
        }*/ 
        id = uuid.generate(); 
        System.out.println(id); 
    } 
}

转自:http://www.wang1314.com/doc/topic-1588537-1.html

时间: 2024-10-02 22:14:57

微信小程序支付(java后端)的相关文章

微信小程序支付及退款流程详解

微信小程序的支付和退款流程 近期在做微信小程序时,涉及到了小程序的支付和退款流程,所以也大概的将这方面的东西看了一个遍,就在这篇博客里总结一下. 首先说明一下,微信小程序支付的主要逻辑集中在后端,前端只需携带支付所需的数据请求后端接口然后根据返回结果做相应成功失败处理即可.我在后端使用的是php,当然在这篇博客里我不打算贴一堆代码来说明支付的具体实现,而主要会侧重于整个支付的流程和一些细节方面的东西.所以使用其他后端语言的朋友有需要也是可以看一下的.很多时候开发的需求和相应问题的解决真的要跳出语

php 微信小程序支付

直接贴代码: 前端测试按钮wxml: <view class="container"> <text class="name">当前选择:<参加活动> ¥0.01</text> <view class="pay" bindtap="onTap">确认支付</view> </view> wxss: .container { padding: 50r

php对接微信小程序支付

前言:这里我就假装你已经注册了微信小程序,并且基本的配置都已经好了.注: 个人注册小程序不支持微信支付,所以我还是假装你是企业或者个体工商户的微信小程序,其他的商户号注册,二者绑定,授权,支付开通,就阅读文档吧,这里我先负责实战. 微信小程序支付开发文档: https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_3&index=1 基本流程: 1. 申请商户平台账号 https://pay.weixin.qq.com/in

asp写的微信小程序支付demo-服务器端是asp+mdb的

这个微信小程序支付demo代码是我用asp写的,微信小程序端加上服务器端用的asp和mdb数据库,下面是代码分享: <view class="container"> <view class='view'>订单说明:{{paydata.title}}</view> <view class='view inputview'> 支付金额:<input bindinput="bindKeyInput" type=&quo

微信小程序支付代码asp源码下载

昨天晚上给朋友写了一个asp的微信小程序支付接口,我这朋友的小程序服务器端用的asp做的,以前没有支付,非让我给写一个支付,因为必须是asp来写,他不会,所以我就帮他写了,顺便还写了一个asp获取用户资料头像和微信名入库的代码,也是asp源码,数据库用的是mdb的格式,还可以比较好用,微信小程序用asp做服务器端估计很少,应该有朋友需要,下载这个代码:ly.ftphn.com/wxpay.rar ============================================= 互相学习

微信小程序支付

关于微信小程序支付功能,他的官方文档真的写的很清楚了!但是整理吸收一下还是不错的 官网呈上:https://developers.weixin.qq.com/miniprogram/dev/api/wx.requestPayment.html 核心流程:下面的图和交互流程描述写的真是不能再清晰了 商户系统和微信支付系统主要交互: 1.小程序内调用登录接口,获取到用户的openid,api参见公共api[小程序登录API] 2.商户server调用支付统一下单,api参见公共api[统一下单API

微信小程序支付最容易犯的坑notify_url(支付回调)

最近做了微信小程序支付,支付成功之后发现notify_url回调地址竟然没有访问. 检查了无数次代码,下单结果里面的回调地址看了又看,都没有错啊. 把回调地址复制出来到浏览器上面,外网也是可以访问的啊. 然后我再分析,为什么以前公众号支付都没有出现这种类型的错误,偏偏小程序就出现了呢. 然后对比了一下发现应对小程序需求,我把域名换成了https的. 然后去把IIS的http访问也加上了,再把回调地址改成了http.试了一下果然有效. 最终总结:微信支付异步回调通知只能支持外网能够访问的80端口的

PHP实现微信小程序支付

本文仅记录了微信小程序支付开发的基本流程和代码,具体业务需自行修改.tp5框架下演示: 参考: 微信小程序支付:业务流程 SDK与DEMO:  下载页 PHPPayDemo: demo 小程序端: goPay(e){ var that = this; //发起预支付,获取所需参数 wx.request({ url: app.globalData.host + '/api/wx_pay/createOrder', //请求地址 data: { openid: wx.getStorageSync('

微信小程序支付功能 C# .NET开发

微信小程序支付功能的开发的时候坑比较多,不过对于钱的事谨慎也是好事.网上关于小程序支付的实例很多,但是大多多少有些问题,C#开发的更少.此篇文档的目的是讲开发过程中遇到的问题做一个备注,也方便其他开发的同学作为参考! 1.首先建议把官方文档支付部分看上三遍,每个细节都不要放过,因为任何一个点和微信要求不符都会导致支付不成功.https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=3_1 2.经过验证的微信支付功能,会需要一些商

Asp.net Core 微信小程序支付

最近要做一个微信小程序支付的功能 在网上找了一下 .net Core做微信支付的博客 和 demo 几乎没有 自己研究了好几天 参考了 很多 大牛的博客 勉强做出来了  因为参数都没有 比如 opid 小程序域名 所以只是简单的测了一下 模拟了微信支付的回调请求 后续等项目上线 会回来填坑的 第一次看小程序支付的api文档 看得我一脸懵逼 现在简单说一下吧 先上一个官方图 小程序支付的流程是这样的 首先 用户下单 然后后台生成订单 调用统一支付api(注意这并不是支付 只是算一个预下单 通知下微