1. 程式人生 > >完整微信小程式支付程式碼+支付工具

完整微信小程式支付程式碼+支付工具

package api.iruhua.controller;

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 javax.servlet.http.HttpServletRequest;

import com.haierp.util.PropertiesUtils;
import org.apache.commons.lang3.StringUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.haierp.model.sale.OuterOrderWxPay;
import com.haierp.service.IOuterOrderWxPayService;
import com.haierp.util.WxPay.MessageUtil;
import com.haierp.util.WxPay.PayUtil;
import com.haierp.util.WxPay.PaymentPo;
import com.haierp.util.WxPay.UUIDHexGenerator;

import net.sf.json.JSONObject;

@Controller
@RequestMapping(“/wx/pay”)
public class WxPayController {
private String total_fee;//總金額
private String body;//商品描述
private String detail;//商品詳情
private String attach;//附加資料
private String time_start;//交易起始時間
private String time_expire;//交易結束時間
private String openid;//使用者標識

@Autowired
private IOuterOrderWxPayService outerOrderWxPayService;

@RequestMapping("/unifiedorder")
@ResponseBody
public Object pay(HttpServletRequest request) throws UnsupportedEncodingException, DocumentException{
    body = new String(request.getParameter("body").getBytes("UTF-8"), "ISO-8859-1");
    String appid = PropertiesUtils.getProperties().getProperty("wx.sale.appId");//小程式ID
    String mch_id = "1505845591";//商戶號
    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 = request.getRemoteAddr();//終端IP
    String notify_url = "http://www.weixin.qq.com/wxpay/pay.php";//通知地址
    String trade_type = "JSAPI";//交易型別  
    String openid=request.getParameter("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(request.getParameter("total_fee"));
    paymentPo.setSpbill_create_ip(spbill_create_ip);
    paymentPo.setNotify_url(notify_url);
    paymentPo.setTrade_type(trade_type);
    paymentPo.setOpenid(openid);

    // 把請求引數打包成Map
    Map<String, String> sParaTemp = new HashMap<String, String>();
    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中的空值和簽名引數
    Map<String, String> sPara = PayUtil.paraFilter(sParaTemp);
    String prestr = PayUtil.createLinkString(sPara); // 把Map所有元素,按照“引數=引數值”的模式用“&”字元拼接成字串
    String key = "&key=Iruha2017Iruha2018Iruha2019Iruha"; // 商戶支付金鑰
    //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 =PayUtil.httpRequest(url, "POST", param);
    // 將解析結果儲存在HashMap中
    Map<String, String> map = new HashMap<String, String>();
    InputStream in=new ByteArrayInputStream(result.getBytes());  
    // 讀取輸入流
    SAXReader reader = new SAXReader();
    Document document = reader.read(in);
    // 得到xml根元素
    Element root = document.getRootElement();
    // 得到根元素的所有子節點
    @SuppressWarnings("unchecked")
    List<Element> 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");//返回資訊
    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=Iruha2017Iruha2018Iruha2019Iruha", "utf-8").toUpperCase();
        JsonObject.put("paySign", paySign);
        //商戶單號
        JsonObject.put("outTradeNo", out_trade_no);
    }

    if(StringUtils.isNotBlank(request.getParameter("orderInfo"))) {
        OuterOrderWxPay outerOrderWxPay = new OuterOrderWxPay();
        outerOrderWxPay.setWxPayTradeNo(out_trade_no);
        outerOrderWxPay.setOrderInfo(request.getParameter("orderInfo"));
        outerOrderWxPay.setStatus(0);
        outerOrderWxPay.setOpenId(openid);
        outerOrderWxPay.setGmtCreate(new Date());
        outerOrderWxPay.setGmtModify(new Date());
        outerOrderWxPayService.insert(outerOrderWxPay);
    }
    return JsonObject;
}
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 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;
}

public static void main(String[] args) throws UnsupportedEncodingException, DocumentException {
    String appid = PropertiesUtils.getProperties().getProperty("wx.sale.appId");//小程式ID
    String mch_id = "1505845591";//商戶號
    String nonce_str = UUIDHexGenerator.generate();//隨機字串
    String out_trade_no = "14867202922017092214472206842118";

    //封裝支付引數
    PaymentPo paymentPo = new PaymentPo();
    paymentPo.setAppid(appid);
    paymentPo.setMch_id(mch_id);
    paymentPo.setNonce_str(nonce_str);
    paymentPo.setOut_trade_no(out_trade_no);

    // 把請求引數打包成Map
    Map<String, String> sParaTemp = new HashMap<String, String>();
    sParaTemp.put("appid", paymentPo.getAppid());
    sParaTemp.put("mch_id", paymentPo.getMch_id());
    sParaTemp.put("nonce_str", paymentPo.getNonce_str());
    sParaTemp.put("out_trade_no", paymentPo.getOut_trade_no());

    // 除去Map中的空值和簽名引數
    Map<String, String> sPara = PayUtil.paraFilter(sParaTemp);
    String prestr = PayUtil.createLinkString(sPara); // 把Map所有元素,按照“引數=引數值”的模式用“&”字元拼接成字串
    String key = "&key=Iruha2017Iruha2018Iruha2019Iruha"; // 商戶支付金鑰
    //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/orderquery";//統一下單API介面連結
    String param = respXml;
    String result =PayUtil.httpRequest(url, "POST", param);
    if(result.contains("<trade_state><![CDATA[SUCCESS]]></trade_state>")) {
        System.out.println("成功");
    } else {
        System.out.println("失敗");
    }
}

}
// 本地微信支付實體類支付資料記錄進入表內;
package com.haierp.model.sale;

import java.io.Serializable;
import java.util.Date;

import com.baomidou.mybatisplus.annotations.IdType;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;

@TableName(“outer_order_wx_pay”)
public class OuterOrderWxPay implements Serializable {
@TableId(type = IdType.AUTO)
private Long id;

@TableField(value = "wx_pay_trade_no")
private String wxPayTradeNo; // 微信支付商戶訂單號

@TableField(value = "order_info")
private String orderInfo;//訂單明細

private Integer status;// 訂單狀態

@TableField(value = "open_id")
private String openId;//訂單明細

@TableField(value = "gmt_create")
private Date gmtCreate;

@TableField(value = "gmt_modify")
private Date gmtModify;

public Long getId() {
    return id;
}
public void setId(Long id) {
    this.id = id;
}
public Integer getStatus() {
    return status;
}
public void setStatus(Integer status) {
    this.status = status;
}
public String getWxPayTradeNo() {
    return wxPayTradeNo;
}
public void setWxPayTradeNo(String wxPayTradeNo) {
    this.wxPayTradeNo = wxPayTradeNo;
}
public String getOrderInfo() {
    return orderInfo;
}
public void setOrderInfo(String orderInfo) {
    this.orderInfo = orderInfo;
}
public String getOpenId() {
    return openId;
}
public void setOpenId(String openId) {
    this.openId = openId;
}
public Date getGmtCreate() {
    return gmtCreate;
}
public void setGmtCreate(Date gmtCreate) {
    this.gmtCreate = gmtCreate;
}
public Date getGmtModify() {
    return gmtModify;
}
public void setGmtModify(Date gmtModify) {
    this.gmtModify = gmtModify;
}

}

// 微信支付資訊工具類

package com.haierp.util.WxPay;

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<String,String> parseXML(HttpServletRequest request) throws Exception, IOException{
    HashMap<String,String> map=new HashMap<String,String>();
    // 通過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<String,String> map){
    //得到根節點的子節點列表
    List<Element> 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("<![CDATA[");
                    writer.write(text);
                    writer.write("]]>");
                } else {
                    writer.write(text);
                }
            }
        };
    }
});

public static String messageToXML(PaymentPo paymentPo){
    xstream.alias("xml",PaymentPo.class);
    return xstream.toXML(paymentPo);
}

}

package com.haierp.util.WxPay;

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.security.SignatureException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.wangzhixuan.commons.utils.DigestUtils;

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<String, String> paraFilter(Map<String, String> sArray) {
    Map<String, String> result = new HashMap<String, String>();
    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<String, String> params) {
    List<String> keys = new ArrayList<String>(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;
}

}

package com.haierp.util.WxPay;

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 getDevice_info() {
return device_info;
}
public void setDevice_info(String device_info) {
this.device_info = device_info;
}
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 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 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 getFee_type() {
return fee_type;
}
public void setFee_type(String fee_type) {
this.fee_type = fee_type;
}
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 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 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 getLimit_pay() {
return limit_pay;
}
public void setLimit_pay(String limit_pay) {
this.limit_pay = limit_pay;
}
public String getOpenid() {
return openid;
}
public void setOpenid(String openid) {
this.openid = openid;
}

}

package com.haierp.util.WxPay;

import java.net.InetAddress;

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() >>> 8);

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 << 8) - Byte.MIN_VALUE + (int) bytes[i];
    }
    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();
}

}

相關推薦

完整程式支付程式碼+支付工具

package api.iruhua.controller; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.UnsupportedEncodi

程式快速移植支付程式

 移植背景: 1. 支付寶小程式開發文件只瞭解了大致框架,跑了demo,具體Api、元件沒太多瞭解; 2. 已有微信小程式,移植支付寶小程式做預研(主要針對授權登入、支付等功能)。 3. 移植的微信小程式屬小型專案,頁面8個,元件兩個。首頁功能性較強,集成了主要的業務處理邏輯,涉及登

程式暫停“虛擬支付”,知識付費程式可以這麼玩!

5月8日起小程式關閉虛擬支付,對於此次小程式關閉虛擬支付影響最大的,應該是知識付費/線上教育類的小程式,這類小程式現有的變現模式將受到巨大的衝擊。   一、這次整改意味著什麼?有3個需要注意   1、虛擬支付 不是所有提供支付功能的小程式都要被整改,僅僅只有涉及“虛擬支付

海外程式微支付程式跨境支付程式境外支付

在上一篇文章《167個國家和地區可以開通微信海外小程式》 你已經瞭解境外公司可以申請微信小程式, 可以把你的商品和服務, 在小程式中展示。 想要在小程式裡完成交易, 必須涉及到線上支付的問題, 很多人

讓你的程式具有線上支付

小編推薦:Fundebug專注於JavaScript、微信小程式、微信小遊戲,Node.js和Java實時BUG監控。真的是一個很好用的bug監控費服務,眾多大佬公司都在使用。 最近需要在微信小程式中用到線上支付功能,於是看了一下官方的文件,發現要在小程式裡實現微信支付還是很方便的

程式 c#後臺支付結果回撥

public partial class NativeNotifyPage : System.Web.UI.Page { public static string wxJsApiParam { get; set; } //前段顯示 public string r

讓你的程式具有線上支付功能

最近需要在微信小程式中用到線上支付功能,於是看了一下官方的文件,發現要在小程式裡實現微信支付還是很方便的,如果你以前開發過服務號下的微信支付,那麼你會發現其實小程式裡的微信支付和服務號裡的開發過程如出一轍,下面我就具體說一下小程式裡微信支付的開發流程和注意點。 1.

程式具有線上支付功能

最近需要在微信小程式中用到線上支付功能,於是看了一下官方的文件,發現要在小程式裡實現微信支付還是很方便的,如果你以前開發過服務號下的微信支付,那麼你會發現其實小程式裡的微信支付和服務號裡的開發過程如出一轍,下面我就具體說一下小程式裡微信支付的開發流程和注意點。 1.開通微信支付和微信商戶號 這個過程就和

程式使用程式碼切換底部導航

先上程式碼: wx.switchTab({ url: "/pages/block/block", }) 注意: 1.該方法的引數url只能賦在app.json中配置的tabBar下list中配置過的url: 2.switchTab不支援queryString,也就是

程式 購物車程式碼

// pages/goods/goods.js Page({   data: {     goods: [       {         "name": "熱銷榜",         "type": -1,         "foods": [           {  

程式一行程式碼實現公眾號頁面程式碼複用

最近在弄微信小程式,剛開始看官方文件,BOSS想要註冊一個小程式,通過點選小程式分享出來的的連結直接進入微信公眾號的首頁,這樣省的再寫一套小程式的程式碼,省時省事(其實是BOSS覺得小程式分享出去的頁面比較好看)。一開始想到的是把分享的頁面做的像小程式的分享頁面一樣,不通過小

【明天的地平線】專注Java相關技術:SpringBoot、Spr ingCloud、MyBatis、Docker、服務、叢集、分散式、 Linux、Jenkins、Netty、Angular 5 、Vue 2、程式程式碼生成器等的技術研究和乾貨分

專注Java相關技術:SpringBoot、Spr ingCloud、MyBatis、Docker、微服務、叢集、分散式、 Linux、Jenkins、Netty、Angular 5 、Vue 2、微...

程式程式碼構成——WXML 模板

二、WXML 模板 從事過網頁程式設計的人知道,網頁程式設計採用的是 HTML + CSS + JS 這樣的組合,其中 HTML 是用來描述當前這個頁面的結構,CSS 用來描述頁面的樣子,JS 通常是用來處理這個頁面和使用者的互動。 同樣道理,在小程式中也有同樣的角色

程式常用程式碼

1、請求 var app = getApp(); var that = this; wx.request({ url: app.globalData.host + '/getMoney', data: { token: app.globalData.token, id:

程式搭建、開發工具、快捷鍵介紹

什麼是小程式      小程式是一種不需要下載、安裝即可使用的應用,它實現了觸手可及的夢想,使用者掃一掃或搜一下就能開啟應用,實現了用完即走的理念,使用者不需要安裝太多應用,應用隨處可用,但無須安裝解除安裝1 開發工具連結: 開發工具也需要需

程式(應用號)除錯工具內測破解方法

微信小程式已經開始內測。沒有接到內測的使用者可以參考本教程。如有問題請留言。http://wxopen.notedown.cn/product/官網已經出臺相關產品認證和申請的東西。如果沒有條件的可以看下本教程。開發文件需要下載的程式有1.微信web開發者工具0.72.微信web開發者工具0.90.7下載地址

程式學習(3)-開發工具選單介紹

開發工具介紹 1.開發工具介面 2.選單區介紹 2.1 編輯 預設為編輯狀態顯示,下面的編譯為手動編譯功能,通常情況下修改檔案後儲存會重新整理介面顯示,如果修改的是.js檔案,儲存時會自動進行編譯和重新整理介面顯示 2.2 除錯 通過介面我們可以看出編輯狀態的選單欄與c

程式個人筆記之工具安裝

使用wepy開發微信小程式npm i -g yarnnpm i -g wepy-cli 全域性安裝或更新WePY命令列工具wepy list 檢視專案模板wepy init standard demo1 在開發目錄中生成Demo開發專案cd demo1npm install

程式不支援圖表工具,通過例項帶你瞭解繪製方案

作者:musiq1989,前端開發工程師,專注於前端技術研究和內容分享,Github地址:https://github.com/xiaolin3303。 責編:陳秋歌,關注微信開發等領域,尋求報道或者投稿請發郵件至chenqg#csdn.net。 歡

程式支付 php後臺對接完整程式碼

這個程式碼全是乾貨呀,拿過來可以直接使用。小程式在調起微信支付之前需要5個引數,這時候就需要攜帶code向後臺請求,然後後臺根據code獲取openid 再進行伺服器之間的。。。。 一、準備工作 1、小程式註冊,要以公司的以身份去註冊一個小程式,才有微信支付許可權;