java微信支付--------公众号内H5调起支付

谨以此做记录,方便下次实现,不适合新手拷贝,如有指教,欢迎留言讨论!

新手请参考博文:https://blog.csdn.net/javaYouCome/article/details/79473743,致谢该博主!

微信支付官方文档:https://pay.weixin.qq.com/wiki/doc/api/index.html

记录几个容易出问题的点:

1、参与签名的参数名大小写保持与官方文档一致,

2、在商户平台配置支付目录,类似配置js安全接口域名

3、调用统一下单接口获取prepay_id=参数(参数签名浪费了很多时间,注意参数名保持一致)

主要代码:

后台调用统一下单接口:参数签名工具类来自微信官方支付demo

/**
     * 统一下单接口,获取prepay_id
     * @param request
     * @return
     */
    @RequestMapping(value = "/unifiedOrder", method = RequestMethod.GET)
    @ResponseBody
    public Map<String, String> unifiedOrder(HttpServletRequest request,String openId,String totalFee) {
        try {
            // 不带properties扩展名的文件名
            ResourceBundle wx = ResourceBundle.getBundle("wx");
            // 统一下单 https://api.mch.weixin.qq.com/pay/unifiedorder
            String unifiedorder_url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
            //拼接统一下单地址参数
            Map<String, String> paraMap = new HashMap<String, String>();
            //获取请求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();
            }
            String appid = wx.getString("wx_appid");
            paraMap.put("appid", appid);
            paraMap.put("body", "********");
            paraMap.put("mch_id", "****");
            paraMap.put("nonce_str", WXPayUtil.generateNonceStr());
            paraMap.put("openid", openId);
            paraMap.put("out_trade_no", new Date().getTime()+"");//订单号
            paraMap.put("spbill_create_ip", ip);
            paraMap.put("total_fee",totalFee);
            paraMap.put("trade_type", "JSAPI");
            paraMap.put("notify_url",wx.getString("red_url") + "/callback.do");// 此路径是微信服务器调用支付结果通知路径随意写
            String sign = WXPayUtil.generateSignature(paraMap, "********");
            paraMap.put("sign", sign);
            String xml = WXPayUtil.mapToXml(paraMap);//将所有参数(map)转xml格式
            System.out.println(xml);
            String xmlStr = wxMpService.post(unifiedorder_url, xml); //发送post请求"统一下单接口"返回预支付id:prepay_id  

            //以下内容是返回前端页面的json数据
            String prepay_id = "";//预支付id
            if (xmlStr.indexOf("SUCCESS") != -1) {
                Map<String, String> map = WXPayUtil.xmlToMap(xmlStr);
                prepay_id = (String) map.get("prepay_id");
            }
            Map<String, String> payMap = new HashMap<String, String>();
            payMap.put("appId", 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, "*******");
            payMap.put("paySign", paySign);
            String xml2 = WXPayUtil.mapToXml(payMap);//将所有参数(map)转xml格式
            System.out.println(xml2);
            return payMap;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    @RequestMapping(value="/callback",method=RequestMethod.GET)
    public String callBack(HttpServletRequest request,HttpServletResponse response){
        //System.out.println("微信支付成功,微信发送的callback信息,请注意修改订单信息");
        InputStream is = null;
        try {
            is = request.getInputStream();//获取请求的流信息(这里是微信发的xml格式所有只能使用流来读)
            String xml = WXPayUtil.inputStream2String(is, "UTF-8");
            Map<String, String> notifyMap = WXPayUtil.xmlToMap(xml);//将微信发的xml转map  

            if(notifyMap.get("return_code").equals("SUCCESS")){
                //支付成功
            }  

            //告诉微信服务器收到信息了,不要在调用回调action了========这里很重要回复微信服务器信息用流发送一个xml即可
            response.getWriter().write("<xml><return_code><![CDATA[SUCCESS]]></return_code></xml>");
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

前台jssdk接收配置参数,调起支付:

//支付
    function pay(price){
        $.get("${basePath}/pay/unifiedOrder.do",{"openId":"${sessionScope.openId }","totalFee":price},function(data,status){
            wx.ready(function() {
                wx.chooseWXPay({
                    timestamp: data.timeStamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
                    nonceStr: data.nonceStr, // 支付签名随机串,不长于 32 位
                    package: data.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
                    signType: data.signType, // 签名方式,默认为‘SHA1‘,使用新版支付需传入‘MD5‘
                    paySign: data.paySign, // 支付签名
                    success: function (res) {
                        // 支付成功后的回调函数
                        alert(1);
                    }
                })
            });
        });
    }

原文地址:https://www.cnblogs.com/xcggdd/p/9157447.html

时间: 2024-09-29 17:12:42

java微信支付--------公众号内H5调起支付的相关文章

微信公众号内H5调用微信支付国内服务商模式

最近在折微信公众号内H5用JSAPI调用微信支付,境内服务商版支付,微信支付给出的官方文档以及SDK不够详细,导至我们走了一些弯路,把他分享出来,我这边主要是用PHP开发,所以未加说的话示例都是PHP代码 微信的官方文档  https://pay.weixin.qq.com/wiki/doc/api/jsapi_sl.php?chapter=7_1 1.服务商模式下调用统一下单 独立商户模式统一下单:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php

vue 微信内H5调起支付

在微信内H5调起微信支付,主要依赖于一个微信的内置对象WeixinJSBridge,这个对象在其他浏览器中无效. 主要代码: import axios from 'axios'; export default { methods:{ wxpay() { axios.post(url,data) .then((res) => { if(res.code == 200) { const pay_params = res.data.jsApiParameters if (typeof WeixinJS

企业号微信支付 公众号支付 H5调起支付API示例代码 JSSDK C# .NET

先看效果: 1.本文演示的是微信[企业号]的H5页面微信支付 2.本项目基于开源微信框架WeiXinMPSDK开发:https://github.com/JeffreySu/WeiXinMPSDK 感谢作者苏志巍的开源精神 一.准备部分 相关参数: AppId:公众号的唯一标识(登陆微信企业号后台 - 设置 - 账号信息 - CorpID) AppSecret:(微信企业号后台 - 设置 - 权限管理 - 新建一个拥有所有应用权限的普通管理组 - Secret) Key:商户API密钥(登陆微信

微信支付-公众号支付H5调用支付详解

微信公众号支付 最近项目需要微信支付,然后看了下微信公众号支付,,虽然不难,但是细节还是需要注意的,用了大半天时间写了个demo,并且完整的测试了一下支付流程,下面分享一下微信公众号支付的经验. 一.配置公众号微信支付 需要我们配置微信公众号支付地址和测试白名单. 比如:支付JS页面的地址为 http://www.xxx.com/shop/pay/ 那此处配置www.xxx.com/shop/pay/ 二.开发流程 借用微信公众号支付api(地址 http://pay.weixin.qq.com

免费微信公众号专用h5在线电影票API

免费h5在线电影票API,通过嵌套返回的h5页面url,实现电影票购买. 接口文档:https://www.juhe.cn/docs/api/id/252,通过此申请APPKEY 接口备注:通过请求返回H5的URL,一次获取永久有效,嵌套到对应的应用或网站中即可使用 接口地址:http://v.juhe.cn/wepiao/query 支持格式:json 请求方式:http get/post 请求示例:http://v.juhe.cn/wepiao/query?key=xxxxx 调用样例及调试

微信小程序、微信公众号、H5之间相互跳转

转自慕课网 一.小程序和公众号 答案是:可以相互关联. 在微信公众号里可以添加小程序. 图片有点小,我把文字打出来吧: 可关联已有的小程序或快速创建小程序.已关联的小程序可被使用在自定义菜单和模版消息等场景中. 公众号可关联同主体的10个小程序及不同主体的3个小程序.同一个小程序可关联最多50个公众号. 1.公众号跳小程序 比如说 "丰巢快递柜" 公众号关联的小程序:丰巢寄快递. 2.小程序跳公众号 打开"丰巢寄快递",点击右上角的菜单选项,然后点击"关于

[转]微信小程序、微信公众号、H5之间相互跳转

本文转自:https://www.cnblogs.com/colorful-paopao1/p/8608609.html 转自慕课网 一.小程序和公众号 答案是:可以相互关联. 在微信公众号里可以添加小程序. 图片有点小,我把文字打出来吧: 可关联已有的小程序或快速创建小程序.已关联的小程序可被使用在自定义菜单和模版消息等场景中. 公众号可关联同主体的10个小程序及不同主体的3个小程序.同一个小程序可关联最多50个公众号. 1.公众号跳小程序 比如说 “丰巢快递柜” 公众号关联的小程序:丰巢寄快

微信支付公众号支付redirect_uri域名与后台配置不一致,错误码10003

最近弄微信支付,微信支付公众号支付redirect_uri域名与后台配置不一致,错误码10003,最容易出错两个地方 1,appid 对应不到 2,开发者网页授权 填写域名 文章来自http://www.96net.com.cn 原文地址:https://www.cnblogs.com/96net/p/9648188.html

微信公众号(h5移动端)如何长长按保存图片?

工具:hbuilderX 框架:uniapp 项目:公众号(h5)换装小游戏 项目描述:用户通过微信登录公众号简介,然后根据自己的喜爱选择人物头部(脸部表情.帽子).身体(衣服).配饰.然后生成海报.用户可通过长按图片将生成的海报保存到自己的手机中. 问题:当时认为这个不是什么问题,因为在uniapp中有uni.saveImageToPhotosAlbum可以将图片保存到系统中.后来项目快结束了,说这个功能很重要,然后才发现 不支持h5,这时候,还不是很急,因为在plus还有保存图片的方法plu