②准备好11个参数JSAPI支付方式

1 配置微信平台

①配置微信公众平台

登录微信公众平台=》公众号设置=》功能设置=》网页授权域名

②配置微信商家平台

①先去官方下载SDK,并导进项目中

2 后台代码的实现

JSAPI官方文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1

①先去官方下载SDK,并导进项目中

地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1

②准备好11个参数

appid:商家平台ID。在微信的平台上有body:商品描述。mch_id:商户ID。在微信的平台上有nonce_str:随机字符串,UUID就好了。openid:用户标识。因为这边是用户已经登录成功了。所以在session中就能拿到。out_trade_no:商户订单号spbill_create_ip:终端IP。这个可以从请求头中拿到total_fee:支付金额。单位是分。trade_type:交易类型。这里我填JSAPInotify_url:通知地址。就是用户支付成功之后,微信访问你的哪个接口,跟你传递支付成功的相关信息。

sign:签名。这个签名它是由上面的10个参数计算得出的。

③源码
sendPay类:

import java.io.IOException;import java.io.InputStream;import java.math.BigDecimal;import java.net.URLEncoder;import java.util.HashMap;import java.util.Map;import java.util.UUID;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.http.auth.AUTH;import org.hamcrest.core.Is;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import com.jc.util.wxPay.WXPayUtil;import com.sun.xml.internal.fastinfoset.Encoder;import controller.AuthUtil;import net.sf.json.JSONObject;@Controller@RequestMapping("/pay")public class sendPay {     /**     * @Description 微信浏览器内微信支付/公众号支付(JSAPI)     * @param request     * @param code     * @return Map     */    @RequestMapping(value = "orders")    public @ResponseBody Map orders(HttpServletRequest request, HttpServletResponse response) {        try {                         String openId = "用户的openid";            // 拼接统一下单地址参数            Map paraMap = new HashMap();            // 获取请求ip地址            String ip = request.getHeader("x-forwarded-for");            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {                ip = request.getHeader("Proxy-Client-IP");            }            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {                ip = request.getHeader("WL-Proxy-Client-IP");            }            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {                ip = request.getRemoteAddr();            }            if (ip.indexOf(",") != -1) {                String[] ips = ip.split(",");                ip = ips[0].trim();            }            paraMap.put("appid", AuthUtil.APPID); // 商家平台ID            paraMap.put("body", "纯情小店铺-薯条"); // 商家名称-销售商品类目、String(128)            paraMap.put("mch_id", AuthUtil.MCHID); // 商户ID            paraMap.put("nonce_str", WXPayUtil.generateNonceStr()); // UUID            paraMap.put("openid", openId);            paraMap.put("out_trade_no", UUID.randomUUID().toString().replaceAll("-", ""));// 订单号,每次都不同            paraMap.put("spbill_create_ip", ip);            paraMap.put("total_fee", "1"); // 支付金额,单位分            paraMap.put("trade_type", "JSAPI"); // 支付类型            paraMap.put("notify_url", "用户支付完成后,你想微信调你的哪个接口");// 此路径是微信服务器调用支付结果通知路径随意写            String sign = WXPayUtil.generateSignature(paraMap, AuthUtil.PATERNERKEY);            paraMap.put("sign", sign);            String xml = WXPayUtil.mapToXml(paraMap);// 将所有参数(map)转xml格式            // 统一下单 https://api.mch.weixin.qq.com/pay/unifiedorder            String unifiedorder_url = "https://api.mch.weixin.qq.com/pay/unifiedorder";            System.out.println("xml为:" + xml);            // String xmlStr = HttpRequest.sendPost(unifiedorder_url,            // xml);//发送post请求"统一下单接口"返回预支付id:prepay_id            String xmlStr = HttpRequest.httpsRequest(unifiedorder_url, "POST", xml);            System.out.println("xmlStr为:" + xmlStr);            // 以下内容是返回前端页面的json数据            String prepay_id = "";// 预支付id            if (xmlStr.indexOf("SUCCESS") != -1) {                Map map = WXPayUtil.xmlToMap(xmlStr);                prepay_id = (String) map.get("prepay_id");            }            Map payMap = new HashMap();            payMap.put("appId", AuthUtil.APPID);            payMap.put("timeStamp", WXPayUtil.getCurrentTimestamp() + "");            payMap.put("nonceStr", WXPayUtil.generateNonceStr());            payMap.put("signType", "MD5");            payMap.put("package", "prepay_id=" + prepay_id);            String paySign = WXPayUtil.generateSignature(payMap, AuthUtil.PATERNERKEY);            payMap.put("paySign", paySign);            //将这个6个参数传给前端            return payMap;        } catch (Exception e) {            e.printStackTrace();        }        return null;    }    /**     * @Title: callBack     * @Description: 支付完成的回调函数     * @param:     * @return:     */    @RequestMapping("/notify")    public String callBack(HttpServletRequest request, HttpServletResponse response) {        // System.out.println("微信支付成功,微信发送的callback信息,请注意修改订单信息");        InputStream is = null;        try {            is = request.getInputStream();// 获取请求的流信息(这里是微信发的xml格式所有只能使用流来读)            String xml = WXPayUtil.InputStream2String(is);            Map notifyMap = WXPayUtil.xmlToMap(xml);// 将微信发的xml转map                        System.out.println("微信返回给回调函数的信息为:"+xml);                        if (notifyMap.get("result_code").equals("SUCCESS")) {                String ordersSn = notifyMap.get("out_trade_no");// 商户订单号                String amountpaid = notifyMap.get("total_fee");// 实际支付的订单金额:单位 分                BigDecimal amountPay = (new BigDecimal(amountpaid).divide(new BigDecimal("100"))).setScale(2);// 将分转换成元-实际支付金额:元                /*                 * 以下是自己的业务处理------仅做参考 更新order对应字段/已支付金额/状态码                 */                System.out.println("===notify===回调方法已经被调!!!");                            }                        // 告诉微信服务器收到信息了,不要在调用回调action了========这里很重要回复微信服务器信息用流发送一个xml即可            response.getWriter().write("");        } catch (Exception e) {            e.printStackTrace();        } finally {            if (is != null) {                try {                    is.close();                } catch (IOException e) {                     e.printStackTrace();                }            }        }                return null;    }}

HttpRequest类:

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.URL;import java.net.URLConnection;import java.util.List;import java.util.Map;import javax.net.ssl.HttpsURLConnection;public class HttpRequest {    /**     * 向指定URL发送GET方法的请求     *      * @param url     *            发送请求的URL     * @param param     *            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。     * @return URL 所代表远程资源的响应结果     */    public static String sendGet(String url, String param) {        String result = "";        BufferedReader in = null;        try {            String urlNameString = url + "?" + param;            System.out.println(urlNameString);            URL realUrl = new URL(urlNameString);            // 打开和URL之间的连接            URLConnection connection = realUrl.openConnection();            // 设置通用的请求属性            connection.setRequestProperty("accept", "*/*");            connection.setRequestProperty("connection", "Keep-Alive");            connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");            // 建立实际的连接            connection.connect();            // 获取所有响应头字段            Map> map = connection.getHeaderFields();            // 遍历所有的响应头字段            for (String key : map.keySet()) {                System.out.println(key + "--->" + map.get(key));            }            // 定义 BufferedReader输入流来读取URL的响应            in = new BufferedReader(new InputStreamReader(connection.getInputStream()));            String line;            while ((line = in.readLine()) != null) {                result += line;            }        } catch (Exception e) {            System.out.println("发送GET请求出现异常!" + e);            e.printStackTrace();        }        // 使用finally块来关闭输入流        finally {            try {                if (in != null) {                    in.close();                }            } catch (Exception e2) {                e2.printStackTrace();            }        }        return result;    }    /**     * 向指定 URL 发送POST方法的请求     *      * @param url     *            发送请求的 URL     * @param param     *            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。     * @return 所代表远程资源的响应结果     */    public static String sendPost(String url, String param) {        PrintWriter out = null;        BufferedReader in = null;        String result = "";        try {            URL realUrl = new URL(url);            // 打开和URL之间的连接            URLConnection conn = realUrl.openConnection();            // 设置通用的请求属性            conn.setRequestProperty("accept", "*/*");            conn.setRequestProperty("connection", "Keep-Alive");            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");            // 发送POST请求必须设置如下两行            conn.setDoOutput(true);            conn.setDoInput(true);            // 获取URLConnection对象对应的输出流            out = new PrintWriter(conn.getOutputStream());            // 发送请求参数            out.print(param);            // flush输出流的缓冲            out.flush();            // 定义BufferedReader输入流来读取URL的响应            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));            String line;            while ((line = in.readLine()) != null) {                result += line;            }        } catch (Exception e) {            System.out.println("发送 POST 请求出现异常!" + e);            e.printStackTrace();        }        // 使用finally块来关闭输出流、输入流        finally {            try {                if (out != null) {                    out.close();                }                if (in != null) {                    in.close();                }            } catch (IOException ex) {                ex.printStackTrace();            }        }        return result;    }    /**     * post请求并得到返回结果     *      * @param requestUrl     * @param requestMethod     * @param output     * @return     */    public static String httpsRequest(String requestUrl, String requestMethod, String output) {        try {             URL url = new URL(requestUrl);            HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();            connection.setDoOutput(true);            connection.setDoInput(true);            connection.setUseCaches(false);            connection.setRequestMethod(requestMethod);            if (null != output) {                OutputStream outputStream = connection.getOutputStream();                outputStream.write(output.getBytes("UTF-8"));                outputStream.close();            }            // 从输入流读取返回内容            InputStream inputStream = connection.getInputStream();            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);            String str = null;            StringBuffer buffer = new StringBuffer();            while ((str = bufferedReader.readLine()) != null) {                buffer.append(str);            }            bufferedReader.close();            inputStreamReader.close();            inputStream.close();            inputStream = null;            connection.disconnect();            return buffer.toString();        } catch (Exception ex) {            ex.printStackTrace();        }        return "";    }}

AuthUtil类

import java.io.IOException;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.util.EntityUtils;import net.sf.json.JSONObject;public class AuthUtil {    public static final String APPID = "平台ID";    public static final String APPSECRET = "平台密钥";    public static final String MCHID = "商家ID";    public static final String PATERNERKEY = "商家密钥";            public static JSONObject doGetJson(String url) throws ClientProtocolException, IOException {        JSONObject jsonObject = null;        // 首先初始化HttpClient对象        DefaultHttpClient client = new DefaultHttpClient();        // 通过get方式进行提交        HttpGet httpGet = new HttpGet(url);        // 通过HTTPclient的execute方法进行发送请求        HttpResponse response = client.execute(httpGet);        // 从response里面拿自己想要的结果        HttpEntity entity = response.getEntity();        if (entity != null) {            String result = EntityUtils.toString(entity, "UTF-8");            jsonObject = jsonObject.fromObject(result);        }        // 把链接释放掉        httpGet.releaseConnection();        return jsonObject;    }}

2.3 前端的实现

这是只用一个jsp页面来做测试

微信支付JSP

三,总结

虽然第一次看官方文档很乱,信息量很多,但仔细总结一下,其实就下面这点流程而已。

再记录点,以防有用:

url urlencode

public static String inputStream2String(InputStream inStream, String encoding){        String result = null;        ByteArrayOutputStream outStream = null;        try {         if(inStream != null){          outStream = new ByteArrayOutputStream();          byte[] tempBytes = new byte[1024];          int count = 0;          while((count = inStream.read(tempBytes)) != -1){           outStream.write(tempBytes, 0, count);          }          tempBytes = null;          outStream.flush();          result = new String(outStream.toByteArray(), encoding);          outStream.close();         }        } catch (Exception e) {         result = null;        }         return result;       }

转载:

https://blog.csdn.net/daotiao0199/article/details/85284038

https://blog.csdn.net/javaYouCome/article/details/79473743

调用支付jsapi缺少参数:appid_JAVA实现微信支付功能相关推荐

  1. 调用支付jsapi缺少参数:total_fee_小程序支付问题怎么解决?

    微信小程序开发的过程一定会遇到各种问题,最让人棘手的就是支付问题,因为没有支付做商城类似的小程序就没有办法完成最关键的一步.那么支付失败到底什么原因呢?一下子收集了几个错误类似,希望对你有帮助: No ...

  2. 微信支付接口,提示:调用支付jsapi缺少参数: $key0$

    下面是 官方给的 帮助文档. 支付返回签名错误 注意签名参数的大小写,支付密钥key要到商户平台设置,设置的规则是32位数字与字母大小写的组合.以下链接为签名过程. (https://pay.weix ...

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

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

  4. 调用支付jsapi缺少参数package_iOS微信支付(Swift)

    前言 微信支付的iOS的Demo不言而喻,所有的参数都是后台生成传过来的,完全没参考价值,并且有的注意点文档上也没说,现在我就说一下微信支付开发中需要注意的地方 项目配置 把实例项目中的一下文件拖到项 ...

  5. EasyWechat微信支付jsapi缺少参数 total_fee

    这是因为使用了老版本的EasyWechat(3.x版本及以下),导致创建订单时,有时服务器IP(spbill_create_ip)会获取成ipv6的,有时候获取成ipv4,而微信那边又不认识ipv6, ...

  6. 调用支付jsapi缺少参数 total_fee

    在做微信支付的时候,使用的是easyWecha框架,https://easywechat.org/zh-cn/docs/payment.html 生成js代码调用微信发起支付的时候遇到[缺少参数 to ...

  7. 调用支付JSAPI缺少参数:appid

    最近做微信jsapi支付碰到了个问题,后台返回的数据都正确却显示缺少参数 代码: function jsApiCall() {alert(wxApi);WeixinJSBridge.invoke('g ...

  8. [微信支付 ] prepay_id 为空,可能出现的问题?微信支付失败

    可能主要原因:也是因为商户号没有开通 里面截图都是看的别的博主的+上自己踩坑 虽然好多大同小异 但是不同人总结不同 提供学习使用 忘了保存地址了 侵权就删掉 在做微信支付时,出现错误:package中 ...

  9. 调用支付jsapl缺少参数:totalfee openid无法取得_微信支付的架构到底有多牛?

    作者:方秋枋 原标题:<基于 C++ 构建微信客户端跨平台开发框架> 来自公号:开发者技术前线 背景 作为一个重要业务,微信支付在客户端上面临着各种问题.其中最核心问题就是分平台实现导致的 ...

  10. 调用支付jsapl缺少参数:totalfee openid无法取得_微信支付的软件架构,牛逼!

    ✋点击"面试交流"加入交流群✋ "置顶公众号",每天推送面试专题 最新热文:技术人的江湖,看不见的刀光剑影 背景 作为一个重要业务,微信支付在客户端上面临着各种 ...

最新文章

  1. 如何在Node JS中卸载NPM模块?
  2. ROS学习(九):ROS URDF-link
  3. 20172304 结对编程--四则运算实验总结
  4. 数据挖掘流程(二):数据预处理
  5. linux runable进程查询,关于Linux下进程的详解【进程查看与管理】
  6. noj一道简单的数学题
  7. 同时满足两个条件怎么写_2020年宅基地确权需满足哪些条件?可以写几个人的名字?...
  8. Java 接口和抽象类可以被new么?——顺便总结内部类
  9. [LeetCode] [C++] 206 Reverse Linked List 反转单项链表
  10. 9-18 学习如何使用Python包的管理
  11. C语言实现单链表面试题汇总
  12. 批发电脑配件_2019年10月电脑配件表
  13. 手写一个动态代理实现,手写Proxy,手写ClassLoader,手写InvocationHandler
  14. jmeter tps指标在哪里看_性能之路——性能测试连载 (3)-性能指标
  15. html自动适应布局,用纯CSS实现自适应布局表格
  16. LaTeX数学符号表
  17. 6、深思数盾加密狗使用小记
  18. 进化树构建的方法原理及检验
  19. java配置文件密码加密解密_Java-从配置文件加密/解密用户名和密码
  20. excel文件解密打开密码

热门文章

  1. 20200815每日一句
  2. 传智播客 tcp长连接和短连接 学习笔记
  3. LaTeX之表格中强制换行
  4. Atitit diy战略 attilax总结
  5. Atitit.md5 实现原理
  6. paip.前端加载时间分析之道优化最佳实践
  7. 关于FLEX中找不到目标对象或通道未定义错误
  8. qq安全使用NTFS权限设置法
  9. Julia : 进制之间转换
  10. 券商交易模式下的单产品多券商方案