- 浏览: 34161 次
最新评论
第一步
进入小程序,下单,请求下单支付,调用小程序登录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://bbs.jointforce.com/topic/25765
发表评论
-
微信小程序之提高应用速度小技巧
2017-03-17 17:08 10691、提高页面加载速度 ... -
面向对象三大特性之继承
2017-02-24 14:34 530什么是继承? 继承是将两个类中相同的属性及方法抽取出来,放到 ... -
高效编写微信小程序
2017-02-22 15:26 466微信小程序是一个工程,就和盖房子一样,打好了地基,才能保证后续 ... -
websocket消息推送实现(附代码)
2017-02-14 17:10 1562转自解放号社区:http://bbs.jointforce.c ... -
微信小程序开放部分模糊搜索,你怎么看?
2017-02-13 16:22 413今天看到一则新闻,微信小程序开始开放模糊搜索了,所以亲自测试了 ... -
微信小程序编写tabBar模板,map组件markers属性动态初始化
2017-02-07 16:04 2148一:编写tabBar模板 众所周知,微信小程序的tabBar ... -
目前为止小程序审核不通过原因整理汇总
2017-01-23 14:57 8931、小程序简介没有介绍小程序功能 2、类目与页面提供的内容不一 ... -
微信小程序之图书管理系统(wepy版)
2017-01-19 14:42 10822016年小程序的推出,刷爆了朋友圈。作为一名好奇的程序猿 ... -
微信小程序form组件
2017-01-18 15:29 1077form 组件 表单 主要属性: 效果图: form. ... -
wafer-master小程序
2017-01-13 15:00 597wafer-master小程序 1、Centos 重启ngin ... -
信小程序参数二维码的8大使用场景
2017-01-12 15:13 695一、小程序参数二维码的8大使用场景 1 地推。 使用 ... -
小程序用户反馈-HotApp小程序统计仿微信聊天用户反馈组件...
2017-01-06 14:46 557用户反馈是小程序开发 ... -
小程序是微信最后的机会吗?它能做多大?
2017-01-05 15:46 526微信小程序又刷屏了。 ... -
获得session_key和openId(加解密、签名系列)
2016-12-26 15:57 10391:session_key和openId是什么?session ... -
5个关键词看小程序和App的UI设计异同
2016-12-23 14:20 553关键词一:友好礼貌对应于苹果:Less is more 苹果在 ... -
微信小程序正式发布官方视觉组件库,传递了怎样的信号?
2016-12-21 17:16 56812月16日,微信正式发布了WeUI.js动态视觉组件库。We ... -
微信小程序canvas组件简单运用之涂鸦
2016-12-19 14:17 517源码 index.html <view class ... -
《转》小程序之本地缓存
2016-12-16 15:07 925目前,微信给每个小程序提供了10M的本地缓存空间 有了本地缓存 ... -
深度加速:微信小程序将成为下一个风口
2016-12-09 16:58 3462016年11月3日,“小程 ... -
深度加速:微信小程序将成为下一个风口
2016-12-09 16:55 4432016年11月3日,“小程序 ...
相关推荐
微信小程序+java后端实现, 里边带完整的项目部署方案,按部就班就好,非常完善 微信小程序+java后端实现, 里边带完整的项目部署方案,按部就班就好,非常完善 微信小程序+java后端实现, 里边带完整的项目部署方案...
基于微信小程序+Java后端的打印室预约毕业设计(源码+演示视频+说明+数据库).rar 【项目技术】 微信小程序开发工具+java后端+mysql 【演示视频】 https://pan.quark.cn/s/ec69fd640a2e 【实现功能】 本微信小程序...
基于微信小程序+Java后端的基于h5 移动网赚项目毕业设计(源码+演示视频+说明+数据库).rar 【项目技术】 微信小程序开发工具+java后端+mysql 【演示视频】 https://pan.quark.cn/s/ec69fd640a2e 【实现功能】 本...
基于微信小程序+Java后端的房屋租赁管理系统毕业设计(源码+演示视频+说明+数据库).rar 【项目技术】 微信小程序开发工具+java后端+mysql 【演示视频】 https://pan.quark.cn/s/ec69fd640a2e 【实现功能】 本基于...
基于微信小程序+Java后端的马拉松报名系统毕业设计(源码+演示视频+说明+数据库).rar 【项目技术】 微信小程序开发工具+java后端+mysql 【演示视频】 https://pan.quark.cn/s/ec69fd640a2e 【实现功能】 管理员功能...
基于微信小程序+Java后端的宿舍管理小程序毕业设计(源码+数据库+说明).zip基于微信小程序+Java后端的宿舍管理小程序毕业设计(源码+数据库+说明).zip基于微信小程序+Java后端的宿舍管理小程序毕业设计(源码+数据库+...
基于微信小程序+java后端的捷邻小程序毕业设计(源码+数据库+说明).rar基于微信小程序+java后端的捷邻小程序毕业设计(源码+数据库+说明).rar基于微信小程序+java后端的捷邻小程序毕业设计(源码+数据库+说明).rar基于...
在这个“微信小程序支付demo后端(springboot)”项目中,开发者使用Java和Spring Boot框架来构建了一个能够处理微信小程序支付请求的服务器端接口。下面将详细介绍这个项目中的关键知识点。 1. **Spring Boot**: ...
基于微信小程序+java后端的学生购电小程序毕业设计(源码+数据库+说明).zip基于微信小程序+java后端的学生购电小程序毕业设计(源码+数据库+说明).zip基于微信小程序+java后端的学生购电小程序毕业设计(源码+数据库+...
基于微信小程序+Java后端的微信点餐系统毕业设计(源码+数据库+说明).zip基于微信小程序+Java后端的微信点餐系统毕业设计(源码+数据库+说明).zip基于微信小程序+Java后端的微信点餐系统毕业设计(源码+数据库+说明)....
基于微信小程序+java后端的美容院管理系统毕业设计(源码+数据库+说明).zip 基于微信小程序+java后端的美容院管理系统毕业设计(源码+数据库+说明).zip 基于微信小程序+java后端的美容院管理系统毕业设计(源码+数据库+...
基于微信小程序+java后端的校园二手交易平台小程序毕业设计(源码+数据库+说明).rar基于微信小程序+java后端的校园二手交易平台小程序毕业设计(源码+数据库+说明).rar基于微信小程序+java后端的校园二手交易平台小...
微信小程序连接Java后端主要涉及的是前后端交互的技术实现,这一过程涵盖了多个技术知识点,包括微信小程序的开发、Java后端API设计与实现、数据传输协议以及认证授权机制等。以下将详细介绍这些方面: 1. **微信小...
基于微信小程序+java后端的租房平台毕业设计(源码+数据库+说明).zip基于微信小程序+java后端的租房平台毕业设计(源码+数据库+说明).zip基于微信小程序+java后端的租房平台毕业设计(源码+数据库+说明).zip基于微信小...
基于微信小程序+Java后端的点餐系统毕业设计(源码+数据库+说明).zip基于微信小程序+Java后端的点餐系统毕业设计(源码+数据库+说明).zip基于微信小程序+Java后端的点餐系统毕业设计(源码+数据库+说明).zip基于微信小...
基于微信小程序+Java后端的学生宿舍管理系统毕业设计(源码+数据库+说明).zip基于微信小程序+Java后端的学生宿舍管理系统毕业设计(源码+数据库+说明).zip基于微信小程序+Java后端的学生宿舍管理系统毕业设计(源码+...
基于微信小程序+java后端的面向企事业单位的项目申报小程序毕业设计(源码+数据库+说明).rar基于微信小程序+java后端的面向企事业单位的项目申报小程序毕业设计(源码+数据库+说明).rar基于微信小程序+java后端的面向...
基于微信小程序+java后端的电影院票务系统毕业设计(源码+数据库+说明).zip基于微信小程序+java后端的电影院票务系统毕业设计(源码+数据库+说明).zip基于微信小程序+java后端的电影院票务系统毕业设计(源码+数据库+...
基于微信小程序+Java后端的高校餐厅食品留样管理系统毕业设计(源码+数据库+说明).zip基于微信小程序+Java后端的高校餐厅食品留样管理系统毕业设计(源码+数据库+说明).zip基于微信小程序+Java后端的高校餐厅食品留样...
基于微信小程序+Java后端的小区租拼车管理信息系统毕业设计(源码+演示视频+说明+数据库).rar 【项目技术】 微信小程序开发工具+java后端+mysql 【演示视频】 https://pan.quark.cn/s/ec69fd640a2e 【实现功能】 ...