哈喽,朋友们,下面得微信支付我的后台使用的  若依微服务版   下面我会先从前台开始,附图及一步一步讲解实验微信支付得简单方法,开搞。

小程序端确认支付按钮,绑定一个@click事件:getDetailsList   代码如下:

<text class="mix-btn" @click="getDetailsList">确认支付</text>

下附调用方法代码:

 //微信支付async getDetailsList() {let _this = this;// 准备参数对象const query = {//名称tetlo: this.name,//订单号money: this.price,//用户的OpenidopenId: this.openid,}//  发起请求const res = await uni.$http.get('/PaySdk/pay', query) // ”/PaySdk/pay“   为后台请求路径   query 为上面准备的参数   必要   我这里得订单号为此商品得ID  通过跳转页面传过来得//下面得是请求后台成功后然会得不需要更改    res为上面请求成功后返回的参数  想知道是什么可以在这个位置   打一个console.log(res)  查看uni.requestPayment({     provider: "wxpay",orderInfo: res.data,timeStamp: res.data.timeStamp,nonceStr: res.data.nonceStr,package: res.data.package,signType: res.data.signType,paySign: res.data.paySign,success(res) {_this.submit();//uni.showToast  一个弹出框  这个不用多说了吧uni.showToast({title: '支付成功! 正在处理请稍后~',icon: 'none'})//这个是支付成功后跳转到主页面   这个根据你个人需求  更改一下  我这个跳转时带有延时setTimeout(function () {uni.navigateTo({// 要导航到的页面地址url: '/pages/indexs?index=' + 0,})}, 3000)},fail(e) {console.log(e);uni.hideLoading();uni.showToast({title: '支付失败,请稍后再试',icon: 'none'})}})    },

后面开始我们得后台代码,  因为我用的是若依得微服务版本,单独分出来了一个微信接口处理得单独模块, 下面我的目录结构:

下面就是需要得类,我是单独得创建了一个文件夹,这个里面除了PaySdk 以外  直接复制粘贴就可以了。

下附第一个     HttpClient类     请注意更改:package com.keyan.whart.WhartSdk   改为自己得

package com.keyan.whart.WhartSdk;import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.*;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContextBuilder;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;import javax.net.ssl.SSLContext;
import java.io.IOException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;/*** http请求客户端** @author Administrator*/
public class HttpClient {private String url;private Map<String, String> param;private int statusCode;private String content;private String xmlParam;private boolean isHttps;public boolean isHttps() {return isHttps;}public void setHttps(boolean isHttps) {this.isHttps = isHttps;}public String getXmlParam() {return xmlParam;}public void setXmlParam(String xmlParam) {this.xmlParam = xmlParam;}public HttpClient(String url, Map<String, String> param) {this.url = url;this.param = param;}public HttpClient(String url) {this.url = url;}public void setParameter(Map<String, String> map) {param = map;}public void addParameter(String key, String value) {if (param == null)param = new HashMap<String, String>();param.put(key, value);}public void post() {HttpPost http = new HttpPost(url);setEntity(http);try {execute(http);} catch (IOException e) {e.printStackTrace();}}public void put() throws ClientProtocolException, IOException {HttpPut http = new HttpPut(url);setEntity(http);execute(http);}public void get() throws ClientProtocolException, IOException {if (param != null) {StringBuilder url = new StringBuilder(this.url);boolean isFirst = true;for (String key : param.keySet()) {if (isFirst)url.append("?");elseurl.append("&");url.append(key).append("=").append(param.get(key));}this.url = url.toString();}HttpGet http = new HttpGet(url);execute(http);}/*** set http post,put param*/private void setEntity(HttpEntityEnclosingRequestBase http) {if (param != null) {List<NameValuePair> nvps = new LinkedList<NameValuePair>();for (String key : param.keySet())nvps.add(new BasicNameValuePair(key, param.get(key))); // 参数http.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8)); // 设置参数}if (xmlParam != null) {http.setEntity(new StringEntity(xmlParam, Consts.UTF_8));}}private void execute(HttpUriRequest http) throws ClientProtocolException,IOException {CloseableHttpClient httpClient = null;try {if (isHttps) {SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {// 信任所有public boolean isTrusted(X509Certificate[] chain,String authType)throws CertificateException {return true;}}).build();SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();} else {httpClient = HttpClients.createDefault();}CloseableHttpResponse response = httpClient.execute(http);try {if (response != null) {if (response.getStatusLine() != null)statusCode = response.getStatusLine().getStatusCode();HttpEntity entity = response.getEntity();// 响应内容content = EntityUtils.toString(entity, Consts.UTF_8);}} finally {response.close();}} catch (Exception e) {e.printStackTrace();} finally {httpClient.close();}}public int getStatusCode() {return statusCode;}public String getContent() {return content;}}

继续      IWXPayDomain 类

package com.keyan.whart.WhartSdk;/*** 域名管理,实现主备域名自动切换*/
public abstract interface IWXPayDomain {/*** 上报域名网络状况* @param domain 域名。 比如:api.mch.weixin.qq.com* @param elapsedTimeMillis 耗时* @param ex 网络请求中出现的异常。*           null表示没有异常*           ConnectTimeoutException,表示建立网络连接异常*           UnknownHostException, 表示dns解析异常*/abstract void report(final String domain, long elapsedTimeMillis, final Exception ex);/*** 获取域名* @param config 配置* @return 域名*/abstract DomainInfo getDomain(final WXPayConfig config);static class DomainInfo{public String domain;       //域名public boolean primaryDomain;     //该域名是否为主域名。例如:api.mch.weixin.qq.com为主域名public DomainInfo(String domain, boolean primaryDomain) {this.domain = domain;this.primaryDomain = primaryDomain;}@Overridepublic String toString() {return "DomainInfo{" +"domain='" + domain + '\'' +", primaryDomain=" + primaryDomain +'}';}}}

继续 : WXPayConfig

package com.keyan.whart.WhartSdk;import java.io.InputStream;public abstract class WXPayConfig {/*** 获取 App ID** @return App ID*/abstract String getAppID();/*** 获取 Mch ID** @return Mch ID*/abstract String getMchID();/*** 获取 API 密钥** @return API密钥*/abstract String getKey();/*** 获取商户证书内容** @return 商户证书内容*/abstract InputStream getCertStream();/*** HTTP(S) 连接超时时间,单位毫秒** @return*/public int getHttpConnectTimeoutMs() {return 6*1000;}/*** HTTP(S) 读数据超时时间,单位毫秒** @return*/public int getHttpReadTimeoutMs() {return 8*1000;}/*** 获取WXPayDomain, 用于多域名容灾自动切换* @return*/abstract IWXPayDomain getWXPayDomain();/*** 是否自动上报。* 若要关闭自动上报,子类中实现该函数返回 false 即可。** @return*/public boolean shouldAutoReport() {return true;}/*** 进行健康上报的线程的数量** @return*/public int getReportWorkerNum() {return 6;}/*** 健康上报缓存消息的最大数量。会有线程去独立上报* 粗略计算:加入一条消息200B,10000消息占用空间 2000 KB,约为2MB,可以接受** @return*/public int getReportQueueMaxSize() {return 10000;}/*** 批量上报,一次最多上报多个数据** @return*/public int getReportBatchSize() {return 10;}}

继续:WXPayConstants

package com.keyan.whart.WhartSdk;import org.apache.http.client.HttpClient;/*** 常量*/
public class WXPayConstants {public enum SignType {MD5, HMACSHA256}public static final String DOMAIN_API = "api.mch.weixin.qq.com";public static final String DOMAIN_API2 = "api2.mch.weixin.qq.com";public static final String DOMAIN_APIHK = "apihk.mch.weixin.qq.com";public static final String DOMAIN_APIUS = "apius.mch.weixin.qq.com";public static final String FAIL     = "FAIL";public static final String SUCCESS  = "SUCCESS";public static final String HMACSHA256 = "HMAC-SHA256";public static final String MD5 = "MD5";public static final String FIELD_SIGN = "sign";public static final String FIELD_SIGN_TYPE = "sign_type";public static final String WXPAYSDK_VERSION = "WXPaySDK/3.0.9";public static final String USER_AGENT = WXPAYSDK_VERSION +" (" + System.getProperty("os.arch") + " " + System.getProperty("os.name") + " " + System.getProperty("os.version") +") Java/" + System.getProperty("java.version") + " HttpClient/" + HttpClient.class.getPackage().getImplementationVersion();public static final String MICROPAY_URL_SUFFIX     = "/pay/micropay";public static final String UNIFIEDORDER_URL_SUFFIX = "/pay/unifiedorder";public static final String ORDERQUERY_URL_SUFFIX   = "/pay/orderquery";public static final String REVERSE_URL_SUFFIX      = "/secapi/pay/reverse";public static final String CLOSEORDER_URL_SUFFIX   = "/pay/closeorder";public static final String REFUND_URL_SUFFIX       = "/secapi/pay/refund";public static final String REFUNDQUERY_URL_SUFFIX  = "/pay/refundquery";public static final String DOWNLOADBILL_URL_SUFFIX = "/pay/downloadbill";public static final String REPORT_URL_SUFFIX       = "/payitil/report";public static final String SHORTURL_URL_SUFFIX     = "/tools/shorturl";public static final String AUTHCODETOOPENID_URL_SUFFIX = "/tools/authcodetoopenid";// sandboxpublic static final String SANDBOX_MICROPAY_URL_SUFFIX     = "/sandboxnew/pay/micropay";public static final String SANDBOX_UNIFIEDORDER_URL_SUFFIX = "/sandboxnew/pay/unifiedorder";public static final String SANDBOX_ORDERQUERY_URL_SUFFIX   = "/sandboxnew/pay/orderquery";public static final String SANDBOX_REVERSE_URL_SUFFIX      = "/sandboxnew/secapi/pay/reverse";public static final String SANDBOX_CLOSEORDER_URL_SUFFIX   = "/sandboxnew/pay/closeorder";public static final String SANDBOX_REFUND_URL_SUFFIX       = "/sandboxnew/secapi/pay/refund";public static final String SANDBOX_REFUNDQUERY_URL_SUFFIX  = "/sandboxnew/pay/refundquery";public static final String SANDBOX_DOWNLOADBILL_URL_SUFFIX = "/sandboxnew/pay/downloadbill";public static final String SANDBOX_REPORT_URL_SUFFIX       = "/sandboxnew/payitil/report";public static final String SANDBOX_SHORTURL_URL_SUFFIX     = "/sandboxnew/tools/shorturl";public static final String SANDBOX_AUTHCODETOOPENID_URL_SUFFIX = "/sandboxnew/tools/authcodetoopenid";}

继续:WXPayUtil

package com.keyan.whart.WhartSdk;import com.keyan.whart.WhartSdk.WXPayConstants.SignType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.StringWriter;
import java.security.MessageDigest;
import java.security.SecureRandom;
import java.util.*;public class WXPayUtil {private static final String SYMBOLS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";private static final Random RANDOM = new SecureRandom();/*** XML格式字符串转换为Map** @param strXML XML字符串* @return XML数据转换后的Map* @throws Exception*/public static Map<String, String> xmlToMap(String strXML) throws Exception {try {Map<String, String> data = new HashMap<String, String>();DocumentBuilder documentBuilder = WXPayXmlUtil.newDocumentBuilder();InputStream stream = new ByteArrayInputStream(strXML.getBytes("UTF-8"));org.w3c.dom.Document doc = documentBuilder.parse(stream);doc.getDocumentElement().normalize();NodeList nodeList = doc.getDocumentElement().getChildNodes();for (int idx = 0; idx < nodeList.getLength(); ++idx) {Node node = nodeList.item(idx);if (node.getNodeType() == Node.ELEMENT_NODE) {org.w3c.dom.Element element = (org.w3c.dom.Element) node;data.put(element.getNodeName(), element.getTextContent());}}try {stream.close();} catch (Exception ex) {// do nothing}return data;} catch (Exception ex) {WXPayUtil.getLogger().warn("Invalid XML, can not convert to map. Error message: {}. XML content: {}", ex.getMessage(), strXML);throw ex;}}/*** 将Map转换为XML格式的字符串** @param data Map类型数据* @return XML格式的字符串* @throws Exception*/public static String mapToXml(Map<String, String> data) throws Exception {org.w3c.dom.Document document = WXPayXmlUtil.newDocument();org.w3c.dom.Element root = document.createElement("xml");document.appendChild(root);for (String key: data.keySet()) {String value = data.get(key);if (value == null) {value = "";}value = value.trim();org.w3c.dom.Element filed = document.createElement(key);filed.appendChild(document.createTextNode(value));root.appendChild(filed);}TransformerFactory tf = TransformerFactory.newInstance();Transformer transformer = tf.newTransformer();DOMSource source = new DOMSource(document);transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");transformer.setOutputProperty(OutputKeys.INDENT, "yes");StringWriter writer = new StringWriter();StreamResult result = new StreamResult(writer);transformer.transform(source, result);String output = writer.getBuffer().toString(); //.replaceAll("\n|\r", "");try {writer.close();}catch (Exception ex) {}return output;}/*** 生成带有 sign 的 XML 格式字符串** @param data Map类型数据* @param key API密钥* @return 含有sign字段的XML*/public static String generateSignedXml(final Map<String, String> data, String key) throws Exception {return generateSignedXml(data, key, SignType.MD5);}/*** 生成带有 sign 的 XML 格式字符串** @param data Map类型数据* @param key API密钥* @param signType 签名类型* @return 含有sign字段的XML*/public static String generateSignedXml(final Map<String, String> data, String key, SignType signType) throws Exception {String sign = generateSignature(data, key, signType);data.put(WXPayConstants.FIELD_SIGN, sign);return mapToXml(data);}/*** 判断签名是否正确** @param xmlStr XML格式数据* @param key API密钥* @return 签名是否正确* @throws Exception*/public static boolean isSignatureValid(String xmlStr, String key) throws Exception {Map<String, String> data = xmlToMap(xmlStr);if (!data.containsKey(WXPayConstants.FIELD_SIGN) ) {return false;}String sign = data.get(WXPayConstants.FIELD_SIGN);return generateSignature(data, key).equals(sign);}/*** 判断签名是否正确,必须包含sign字段,否则返回false。使用MD5签名。** @param data Map类型数据* @param key API密钥* @return 签名是否正确* @throws Exception*/public static boolean isSignatureValid(Map<String, String> data, String key) throws Exception {return isSignatureValid(data, key, SignType.MD5);}/*** 判断签名是否正确,必须包含sign字段,否则返回false。** @param data Map类型数据* @param key API密钥* @param signType 签名方式* @return 签名是否正确* @throws Exception*/public static boolean isSignatureValid(Map<String, String> data, String key, SignType signType) throws Exception {if (!data.containsKey(WXPayConstants.FIELD_SIGN) ) {return false;}String sign = data.get(WXPayConstants.FIELD_SIGN);return generateSignature(data, key, signType).equals(sign);}/*** 生成签名** @param data 待签名数据* @param key API密钥* @return 签名*/public static String generateSignature(final Map<String, String> data, String key) throws Exception {return generateSignature(data, key, SignType.MD5);}/*** 生成签名. 注意,若含有sign_type字段,必须和signType参数保持一致。** @param data 待签名数据* @param key API密钥* @param signType 签名方式* @return 签名*/public static String generateSignature(final Map<String, String> data, String key, SignType signType) throws Exception {Set<String> keySet = data.keySet();String[] keyArray = keySet.toArray(new String[keySet.size()]);Arrays.sort(keyArray);StringBuilder sb = new StringBuilder();for (String k : keyArray) {if (k.equals(WXPayConstants.FIELD_SIGN)) {continue;}if (data.get(k).trim().length() > 0) // 参数值为空,则不参与签名sb.append(k).append("=").append(data.get(k).trim()).append("&");}sb.append("key=").append(key);if (SignType.MD5.equals(signType)) {return MD5(sb.toString()).toUpperCase();}else if (SignType.HMACSHA256.equals(signType)) {return HMACSHA256(sb.toString(), key);}else {throw new Exception(String.format("Invalid sign_type: %s", signType));}}/*** 获取随机字符串 Nonce Str** @return String 随机字符串*/public static String generateNonceStr() {char[] nonceChars = new char[32];for (int index = 0; index < nonceChars.length; ++index) {nonceChars[index] = SYMBOLS.charAt(RANDOM.nextInt(SYMBOLS.length()));}return new String(nonceChars);}/*** 生成 MD5** @param data 待处理数据* @return MD5结果*/public static String MD5(String data) throws Exception {MessageDigest md = MessageDigest.getInstance("MD5");byte[] array = md.digest(data.getBytes("UTF-8"));StringBuilder sb = new StringBuilder();for (byte item : array) {sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));}return sb.toString().toUpperCase();}/*** 生成 HMACSHA256* @param data 待处理数据* @param key 密钥* @return 加密结果* @throws Exception*/public static String HMACSHA256(String data, String key) throws Exception {Mac sha256_HMAC = Mac.getInstance("HmacSHA256");SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256");sha256_HMAC.init(secret_key);byte[] array = sha256_HMAC.doFinal(data.getBytes("UTF-8"));StringBuilder sb = new StringBuilder();for (byte item : array) {sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));}return sb.toString().toUpperCase();}/*** 日志* @return*/public static Logger getLogger() {Logger logger = LoggerFactory.getLogger("wxpay java sdk");return logger;}/*** 获取当前时间戳,单位秒* @return*/public static long getCurrentTimestamp() {return System.currentTimeMillis()/1000;}/*** 获取当前时间戳,单位毫秒* @return*/public static long getCurrentTimestampMs() {return System.currentTimeMillis();}}

继续:WXPayXmlUtil

package com.keyan.whart.WhartSdk;import org.w3c.dom.Document;import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;/*** 2018/7/3*/
public final class WXPayXmlUtil {public static DocumentBuilder newDocumentBuilder() throws ParserConfigurationException {DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();documentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);documentBuilderFactory.setFeature("http://xml.org/sax/features/external-general-entities", false);documentBuilderFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);documentBuilderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);documentBuilderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);documentBuilderFactory.setXIncludeAware(false);documentBuilderFactory.setExpandEntityReferences(false);return documentBuilderFactory.newDocumentBuilder();}public static Document newDocument() throws ParserConfigurationException {return newDocumentBuilder().newDocument();}
}

继续 :这个目前我没用   但是也放出来看看吧

package com.keyan.whart.WhartSdk;public class WXMiniPayConfig {//api秘钥  从微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置 获取public static final String KEY = "";//    微信支付分配的公众账号ID(企业号corpid即为此appId)public static final String APP_ID = "";//微信支付分配的商户号public static final String MCH_ID = "";}

继续 :这个也是目前我没用   但是也放出来看看吧

package com.keyan.whart.WhartSdk;import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;public class WeiXinPayUtil {//    /**
//     * 微信回调参数解析
//     *
//     * @param request
//     * @return
//     */
//    public static String getPostStr(HttpServletRequest request) {
//        StringBuffer sb = new StringBuffer();
//        try {
//            InputStream is = request.getInputStream();
//            InputStreamReader isr = new InputStreamReader(is, "UTF-8");
//            BufferedReader br = new BufferedReader(isr);
//            String s = "";
//
//            while ((s = br.readLine()) != null) {
//                sb.append(s);
//            }
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        String xml = sb.toString(); //次即为接收到微信端发送过来的xml数据
//        return xml;
//
//    }}

好了   到现在为止   无脑复制粘贴就结束了    上面的复制过去请注意  你的pom文件    你的路径    需要更改得  不是复制过去啥都不管就能用得

接下来就是主要的类了    下附代码:

package com.keyan.whart.WhartSdk;import cn.hutool.core.lang.generator.UUIDGenerator;
import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.PayOrder;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.wx.api.WxPayConfigStorage;
import com.egzosn.pay.wx.api.WxPayService;
import com.egzosn.pay.wx.bean.WxTransactionType;
import lombok.extern.java.Log;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;@Log
@RestController
@RequestMapping("/PaySdk")
public class PaySdk {//初始化配置public PayService init() {WxPayConfigStorage configStorage = new WxPayConfigStorage();//设置关联公众号appIdconfigStorage.setAppId("  ");//设置商户号   微信公众平台商家那块看configStorage.setMchId("  ");//设置AppSecret   小程序密钥啊configStorage.setSecretKey("   ");//设置异步回调   不用改configStorage.setNotifyUrl("http://127.0.0.1");//设置同步回调    不用改configStorage.setReturnUrl("");//设置签名方式     不用改configStorage.setSignType("MD5");//设置编码            不用改configStorage.setInputCharset("utf-8");//设置转账公钥 转账时必填    字面意思   也是公众平台商家设置那里面看configStorage.setKeyPrivate("   ");HttpConfigStorage httpConfigStorage = new HttpConfigStorage();return new WxPayService(configStorage, httpConfigStorage);}/***orderNo订单号*openId 用户标识*/@GetMapping("/pay")public Map pay(String tetlo, String openId, String money ) {//初始化参数PayOrder order = new PayOrder(tetlo,tetlo,new BigDecimal(money),UUID.randomUUID().toString().replace("-",""));//设置小程序支付order.setTransactionType(WxTransactionType.JSAPI);//设置用户openIDorder.setOpenid(openId);//组装参数Map map = init().orderInfo(order);//需要code=0map.put("code", 0);return map;}}

下面是我的pom文件   具体用到什么了  我还真有点忘了   你根据报错 自己拿   下附代码:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>keyan-modules</artifactId><groupId>com.keyan</groupId><version>3.5.0</version></parent><modelVersion>4.0.0</modelVersion><artifactId>keyan-modules-whart</artifactId><description>keyan-modules-whart微信接口</description><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><!--hutool工具类--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.19</version></dependency><!-- SpringCloud Alibaba Nacos --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- SpringCloud Alibaba Nacos Config --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!-- SpringCloud Alibaba Sentinel --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><!-- SpringBoot Actuator --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- Swagger UI --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>${swagger.fox.version}</version></dependency><!-- Mysql Connector --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- RuoYi Common DataSource --><dependency><groupId>com.keyan</groupId><artifactId>keyan-common-datasource</artifactId></dependency><!-- RuoYi Common DataScope --><dependency><groupId>com.keyan</groupId><artifactId>keyan-common-datascope</artifactId></dependency><!-- RuoYi Common Log --><dependency><groupId>com.keyan</groupId><artifactId>keyan-common-log</artifactId></dependency><!-- RuoYi Common Swagger --><dependency><groupId>com.keyan</groupId><artifactId>keyan-common-swagger</artifactId></dependency><!-- 解析JSON所需包--><dependency><groupId>net.sf.json-lib</groupId><artifactId>json-lib-ext-spring</artifactId><version>1.0.2</version></dependency><!-- HttpUtils所需包--><dependency><groupId>commons-httpclient</groupId><artifactId>commons-httpclient</artifactId><version>3.1</version></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.1.0</version></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.6.0</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency><dependency><groupId>net.sf.json-lib</groupId><artifactId>json-lib</artifactId><version>2.4</version><classifier>jdk15</classifier></dependency><!-- huTool 工具包 --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-crypto</artifactId><version>5.5.0</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-http</artifactId><version>5.5.0</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-json</artifactId><version>5.5.0</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.12</version><scope>compile</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><dependency><groupId>com.github.xkzhangsan</groupId><artifactId>xk-time</artifactId><version>2.1.2</version></dependency><dependency><groupId>com.egzosn</groupId><artifactId>pay-java-wx</artifactId><version>2.14.4-fix</version></dependency></dependencies><build><finalName>${project.artifactId}</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>

基本就是这样了,可能会出一些错,但是整体运行下来是没有问题得,但是也只能最基础得微信支付功能,支付成功回调接口啊这些我还没有,也希望大佬可以补充,

实现小程序微信支付功能相关推荐

  1. 小程序微信支付功能开发

    关于小程序内唤起微信支付功能,不同人有不同的思路,有嵌套H5页面的,也有跳转第三方链接网站的,也有放收钱码等图片的. 今天讲一下微信原生的微信支付功能基础版块,支付页面和支付逻辑. 先上个效果图: 页 ...

  2. uniapp小程序微信支付功能

    目录 字段说明 前置工作 获取openid 微信支付 报错问题 uniapp 开发小程序需要实现微信支付功能,下面对相关业务进行说明. 字段说明 AppID:小程序的身份证,微信客户端用来确认你的小程 ...

  3. 小程序 php wecahtpay,【PHP】laravel 实现微信小程序微信支付功能

    准备工作 准备来laravel框架,下载好 overtrue/laravel-wechat 第三方插件composerrequireovertrue/wechat:~4.0-vvv PHP代码 调用支 ...

  4. 小程序微信支付功能逻辑

    官方的思维图在下看不懂,自己整理一份以备后用. 1.打开Pay付款页面 2.用订单号,查看订单信息前端展示. 3.点击付款按钮,提交订单ID到后台,创建微信预支付交易订单,用JSAPI下单 4.返回创 ...

  5. PHP完成微信小程序在线支付功能

    微信支付现在用到的地方越来越多,从公众号支付,扫码支付一直到现在的小程序支付等等六种快捷支付方式,公司要求开发小程序商城,就只能我上手处理接口支付问题了,使用最常规的第三方模式,第三方帮特约商户申请商 ...

  6. 调用支付jsapi缺少参数appid_服务商模式下的小程序微信支付

    最近,要做一个小程序商城的项目,需要在小程序中用到分账功能,也就是顾客购买商品支付的钱要给各个店铺,这就需要用到服务商模式. 在谈服务商模式下小程序微信支付之前,我们先要有一个服务商的商户号,这个商户 ...

  7. 小程序微信支付开发流程记录

    我所在公司需要开发一款商城小程序,里面需要用到微信支付,我负责里面的下单功能,从小程序端到后台的支付流程都是我自己开发的,由于我们组没有人有开发微信支付的经验,只有我有开发过JSAPI的微信支付的经验 ...

  8. 微信小程序收款手续费_小程序微信支付收款流程

    大家都知道,小程序具备微信支付功能,但是,很多商家还不知道具体的收款流程是什么?用户在小程序下单支付的款项究竟到了哪里?或者找第三方公司开发担心资金安全问题? 今天给大家详细的讲解一下: 在实现微信小 ...

  9. 微信小程序 微信支付代码实现流程

    微信小程序 微信支付是一个很简单的流程  微信开发文档 地址:wx.requestPayment(Object object) | 微信开放文档 微信公众平台申请支付功能 百度一大堆例举代码 官方文档 ...

  10. 微信小程序支付返回签名错误_java 微信小程序微信支付统一下订单及数字签名错误问题(后端)...

    今天来分享一下之前做微信小程序微信支付遇到的一些坑,博主这里是微信小程序支付功能,因此选择的微信支付方式是JSAPI支付方式(温馨提示左下角有音乐哦). 首先我们肯定是要在小程序后台绑定一个商户号的, ...

最新文章

  1. php最简单验证码代码,简单好用的PHP验证码类
  2. 知否,知否,交通数据邂逅【数据故事计划二等奖】
  3. 视野逐渐变暗之跳转场景
  4. linux 跑cpu负载工具,CPU负载查看工具
  5. 详解 Java 的八大基本类型,写得非常好!
  6. 大批量插入数据如何优化
  7. 鱼眼图像畸变校正--透视变换
  8. 混沌图像---马丁迭代【密集恐惧症患者慎入】
  9. zabbix创建ITEM,运算语法
  10. Skype for Business Server 2015-01-基础环境-准备
  11. 富士胶片将作为全球合作伙伴赞助菲利普·科特勒教授发起的2019年世界营销峰会,并在网站发布专访
  12. qq传输文件的软件测试点,QQ传文件速度对比测试活动
  13. turtle画彩虹蟒蛇
  14. springcontext.xml 中方言是红色的_12种方言都能听懂!讯飞智能录音笔A1评测:小如钥匙坠+复古磁带造型...
  15. 作为 IT 从业人员,你觉得有什么工具大大提高了你的工作效率?
  16. php fflush失败,php fflush 函数_PHP教程
  17. NG Toolset开发笔记--5GNR Resource Grid(10)
  18. 思考 |《爱好》—— 我真的做到了!
  19. Pycharm如何更改运行(run)的快捷键
  20. 计算摄影:基于深度学习的畸变校正

热门文章

  1. 10月 区块链领域投融资事件
  2. AMD发布22.9.2驱动,支持《禁闭求生(Grounded)》
  3. 别细看|请收藏|堆垛机故障大全及解决办法
  4. 特殊符号大全(无穷的想象力)
  5. html特殊符号怎么输入法,特殊符号怎么打出来?电脑特殊符号输入方法
  6. Red Teaming Mind Map
  7. python实现Excel邮件合并
  8. 软件测试工程师绩效考核细则,软件测试工程师绩效考核方案
  9. 轻盈潇洒卓然不群,敏捷编辑器Sublime text 4中文配置Python3开发运行代码环境(Win11+M1 mac)
  10. 微信小程序返回Qcloud\\Cos\\Exception\\NoSuchBucketException: Cos Error Code: NoSuchBucket, Status Code: 404