微信公众号之微信支付(V3版)jsp页面jsapi统一下单调启支付(java版)

web项目


按顺序一步一步来


准备: 申请了微信支付接口的微信公众号一枚 , 备案的域名网站一枚, (如果有没有的这两个东西会耽误你很久,因为微信支付必须是线上,无法本地调试,)

 这里说一下 如果有经济条件的最好申请一台win系统的服务器作为测试服务器这样会使你省去很多的麻烦,装上开发软件直接在线调试很爽.

首先截了几张需要设置的图,了解一下,开发中自己需要的参数常量


图一

图二


图3

图4

图5

这些设置的地方分别在微信公众号平台和微信商户平台,自从2017年8月改版之后微信支付单独拎出来了,有的配置很隐蔽不是很好找还有那个官方给的微信支付的demo


这是微信目前的demo地址 微信支付demo下载   https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1  


demo是maven项目自行配置之后阅读README.md 文件 按这里的提示修改自己的配置 个人感觉相比较v2版的微信支付V3的demo确实简化了不少

配置MyConfig    .   微信的demo有点小问题需要自己搞搞,

别忘记下载 (图4) 的证书文件,  cert.zip ,安装过程看压缩文件里的教程密码就是公众号的商户号


这里是部分的常量


  微信分配的公众账号ID  APPID="wxb88888888888be";
    /*
     * 微信支付商户号
     */
    public static final String MCH_ID="14888888888";//必填
    /**
     * 设备号
     */
    public static final String DEVICE_INFO="WEB";//非必填
    /**
     * 微信服务器回调通知url
     */
    public static String NOTIFY_URL="http://localhost:80/paySuccess.do";
    /**
     * app_select
     */
    public static final String APPSELECT="e17706b888888888888888c10";
    /**
     * token
     */
    public static final String TOKEN="MYTOKEN";
    /**
     * EncodingAESKey
     */
    public static final String EncodingAESKey="gXL1RGlDN2KfeCL8888888888888EfB6Tyt3y";
    /**
     * API秘钥
     */
    public static final String APPKEY="JXyrBTnsS8888888888HbaVGhdcXso";
 
    

demo配置好之后几乎该有的都有了, 像之前md5加密函数,随机字符串,时间戳等等 微信demo工具类里WXPayUtil.java都提供了


之后就是页面访问调启jsapi支付,




编写后台函数调用统一下单接口

这个后台方法注意了,支付授权目录就是这里

例: http://www.baidu.com/apy/   (授权目录)

这样 这几个fang都可以使用

http://www.baidu.com/pay/doShopScore.do

http://www.baidu.com/pay/doShopScore.do2

http://www.baidu.com/pay/doShopScore.do3



需要注意的一个地方, try {}块里的代码

Map<String, String> mp = wxpay.unifiedOrder(data);

微信处理完之后返回的集合 的使用,

看到返回的值什么都有了就直接拿到jsapi里用,就一直签名验证失败,后来发现 Sign 不是paySign (其实我到现在也不知道你们这个签名是不是一样的含义)  ,艹,谁知道还分这玩意儿 ,说真的微信里参数名起名起的一塌糊涂,乱七八糟,

最后反正只从mp里取了一个参数package用了重新生成了签名,居然可以了,乖乖

这个微信真是的,本来参数就不清楚了开发的时候都得懵, 到底是想干嘛,如果是想让自己生成签名(paySign)干嘛返回签名(Sign)

 


/*** 用户  购买成为 VIP 产生 (积分) 进入付款页面 (接口)*/@ResponseBody@RequestMapping(value = "/pay/doShopScore.do", method = RequestMethod.POST)public Map<String,Object> doShopScore(HttpServletRequest request, HttpServletResponse response,Model model) throws Exception {String custId = Global.ZW_WECHAT_COMPANY_ID;//Map<String,Object> resultMap = new HashMap<String, Object>();String openid = (String) this.getSession().getAttribute("customerOpenId");String body = "科技-物品";//作为订单商品名称使用String total_fee = "0";//总金额数(分)//获取物品idString dbGoodsPriceId = request.getParameter("dbGoodsPriceId");//0 300,1 3000String referrerOpenid = request.getParameter("referrerOpenId");//推荐人的openid 注意大小写String referrerPhone = request.getParameter("referrerPhone");//推荐人的注册电话DbGoodsPrice dbGoodsPrice = null;if(StringUtils.isNotBlank(dbGoodsPriceId)){dbGoodsPrice = dbGoodsPriceService.get(new DbGoodsPrice(dbGoodsPriceId));body = dbGoodsPrice.getDbGoods().getGoodsName();total_fee = String.valueOf(dbGoodsPrice.getGoodsPrice());}String appid = ConstantUtil.APPID;String mch_id = ConstantUtil.MCH_ID;String device_info = ConstantUtil.DEVICE_INFO;String nonce_str = WXPayUtil.generateNonceStr();String out_trade_no = DateUtils.fmtTime14Date(new Date());//商户订单号String fee_type = "CNY";//人民币String spbill_create_ip = request.getRemoteAddr();//终端ipDate currDate = new Date();//当前日期String time_stamp = DateUtilsEx.formatToString(currDate,DateUtilsEx.DATE_FORMAT_SEC_U);//交易起始时间String time_expire = com.jeeplus.common.utils.DateUtils.getCurrTimePushMinute4DateStr(currDate,Integer.valueOf(SetUpUtils.getConfigParam("sys_order_pay_validity_date",custId)));//交易结束时间   当前时间 + 30分钟 String notify_url = ConstantUtil.NOTIFY_URL;String trade_type = ConstantUtil.TRADE_TYPE;//JSAPI//预支付订单生成===================start===========================DbOrder dbOrder = new DbOrder();dbOrder.setOrderCode(SetUpUtils.BaseSeq(custId,1));//订单序号dbOrder.setOrderType(DictUtils.getDictValue("订单","zw_order_type","0"));//订单类型0 股份类型dbOrder.setOutTradeNo(out_trade_no);dbOrder.setGoodName(body);dbOrder.setGoodPrice(Integer.valueOf(total_fee));dbOrder.setGoodsPriceId(dbGoodsPrice.getId());dbOrder.setGoodsNum(1);//dbOrder.setIntegralToCash(0);dbOrder.setTotalPrice(Integer.valueOf(total_fee));dbOrder.setFeeType(DictUtils.getDictValue("人民币","zw_currency","0"));dbOrder.setPayType(DictUtils.getDictValue("微信支付","zw_pay_type","0"));//支付类型dbOrder.setPayState(DictUtils.getDictValue("未支付","zw_pay_state","0"));//订单状态dbOrder.setCustomerOpenid(openid);User user = (User) this.getSession().getAttribute("customer");dbOrder.setOrderPayValidityDate(com.jeeplus.common.utils.DateUtils.getCurrTimePushMinute4Date(currDate,Integer.valueOf(SetUpUtils.getConfigParam("sys_order_pay_validity_date",custId))));//订单支付有效期dbOrder.setCreateBy(user);dbOrder.setCreateDate(new Date());//订单创建时间dbOrder.setReferrerPhone(referrerPhone);//推荐人电话dbOrder.setReferrerOpenid(referrerOpenid);//推荐人openiddbOrder.setUpdateBy(user);dbOrder.setUpdateDate(new Date());dbOrder.setNonceStr(nonce_str);dbOrder.setTimeStamp(time_stamp);dbOrder.setTimeExpire(time_expire);dbOrder.setSpbillCreateIp(spbill_create_ip);if(!dbOrder.getIsNewRecord()){//编辑表单保存DbOrder t = dbOrderService.get(dbOrder.getId());//从数据库取出记录的值MyBeanUtils.copyBeanNotNull2Bean(dbOrder, t);//将编辑表单中的非NULL值覆盖数据库记录中的值dbOrderService.save(t);//保存}else{//新增表单保存dbOrderService.save(dbOrder);//保存}//订单log  未支付//订单id//单据状态 //状态说明 //操作者idDbOrderLog dbOrderLog = setDbRepairLogParam(dbOrder.getId(),0,DictUtils.getDictLabel("0","zw_pay_state","未支付"), user.getId());dbOrderLogService.save(dbOrderLog);//保存this.getSession().setAttribute("orderId",dbOrder.getId());//订单id//预支付订单生成===================end===========================//设置支付参数==============================================MyConfig config = new MyConfig();WXPay wxpay = new WXPay(config, notify_url);Map<String, String> data = new HashMap<String, String>();data.put("appid",appid);data.put("mch_id",mch_id);data.put("device_info",device_info);data.put("body",body);data.put("nonce_str",nonce_str);data.put("openid",openid);data.put("fee_type", fee_type);data.put("trade_type",trade_type);//jsAPI 支付data.put("total_fee", total_fee);data.put("time_start",String.valueOf(time_stamp));//起始时间data.put("time_expire",String.valueOf(time_expire));//结束时间data.put("out_trade_no",out_trade_no);data.put("spbill_create_ip",spbill_create_ip);data.put("notify_url",notify_url);try {Map<String, String> mp = wxpay.unifiedOrder(data);/*model.addAttribute("appid",appid);model.addAttribute("time_stamp",time_stamp);model.addAttribute("openid",openid);model.addAttribute("nonce_str",mp.get("nonce_str"));model.addAttribute("package", "prepay_id="+mp.get("prepay_id").toString().trim());*/Map<String, String> data2 = new HashMap<String, String>();data2.put("appId", appid); // 必须data2.put("timeStamp",String.valueOf(time_stamp));data2.put("nonceStr", mp.get("nonce_str"));data2.put("signType", "MD5");data2.put("package", "prepay_id=" + mp.get("prepay_id").toString().trim());//注意prepay_id的值是一个键值对
//model.addAttribute("paySign",WXPayUtil.generateSignature(data2,ConstantUtil.APPKEY));resultMap.put("appid",appid);resultMap.put("time_stamp",time_stamp);resultMap.put("openid",openid);resultMap.put("nonce_str",mp.get("nonce_str"));resultMap.put("packageStr", "prepay_id="+mp.get("prepay_id").toString().trim());resultMap.put("paySign",WXPayUtil.generateSignature(data2,ConstantUtil.APPKEY));} catch (Exception e) {e.printStackTrace();return null;}return resultMap;}




jsp页面

$.ajax({url:ctx+"/wechat/pay/doShopScore.do",type:"POST",data:{"dbGoodsPriceId":dbGoodsPriceId},success:function(resultMap){submit_flag=true;if(resultMap != null && resultMap !=''){var appid = resultMap.appid;var time_stamp = resultMap.time_stamp;var nonce_str = resultMap.nonce_str;var packageStr = resultMap.packageStr;var paySign = resultMap.paySign;//设置参数WeixinJSBridge.invoke('getBrandWCPayRequest', {"appId":appid,     //公众号名称,由商户传入     "timeStamp":time_stamp+"",         //时间戳,自1970年以来的秒数     "nonceStr":nonce_str, //随机串     "package":packageStr,     "signType":"MD5",//微信签名方式:     "paySign":paySign},function(res){     if(res.err_msg == "get_brand_wcpay_request:ok" ) {    //alert("支付成功");  // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回    ok,但并不保证它绝对可靠。     location.replace(ctx+"/wechat/pay/toSuccessVip.do");//跳到订单成功页}else if (res.err_msg == "get_brand_wcpay_request:cancel")  {  //alert("支付过程中用户取消");  //用户取消订单支付返回订单列表window.location.href=ctx+"/wechat/pay/notPay.do";  }else{  //支付失败  alert(res.err_msg);}   }); }},error:function(e){submit_flag=true;}});


支付成功还要有个成功之后的回调函数,不给返回success 代码 还一直不停的回调,注意了



/**
* 微信支付成功后回调方法
* @param request
* @param response
* @return
* @throws Exception
*/
@ResponseBody  
@RequestMapping(value = "/pay/paySuccess.do")  
    public String notify(HttpServletRequest request, HttpServletResponse response) throws Exception {  
        String result;//返回给微信的处理结果  
        String inputLine;  
        String notityXml = "";  
        request.setCharacterEncoding("UTF-8");  
        //response.setCharacterEncoding("UTF-8");  
        //response.setContentType("text/html;charset=UTF-8");  
        //response.setHeader("Access-Control-Allow-Origin", "*");  
        //微信给返回的东西  
        try {  
            while ((inputLine = request.getReader().readLine()) != null) {  
                notityXml += inputLine;  
            }  
            request.getReader().close();  
        } catch (Exception e) {  
            e.printStackTrace();  
            result = setXml("fail","xml获取失败");  
        }  
        if (StringUtils.isEmpty(notityXml)) {  
            result = setXml("fail","xml为空");  
        }  
        
        System.out.println(notityXml);
        Map map = WXPayUtil.xmlToMap(notityXml);  
        // 解析各种数据  
        String appid = (String) map.get("appid");//应用ID  
        String attach = (String) map.get("attach");//商家数据包  
        String bank_type = (String) map.get("bank_type");//付款银行  
        String cash_fee = (String) map.get("cash_fee");//现金支付金额  
        String fee_type = (String) map.get("fee_type");//货币种类  
        String is_subscribe = (String) map.get("is_subscribe");//是否关注公众账号  
        String mch_id = (String) map.get("mch_id");//商户号  
        String nonce_str = (String) map.get("nonce_str");//随机字符串  
        String openid = (String) map.get("openid");//用户标识  
        String out_trade_no = (String) map.get("out_trade_no");// 获取商户订单号  
        String result_code = (String) map.get("result_code");// 业务结果  
        String return_code = (String) map.get("return_code");// SUCCESS/FAIL  
        String sign = (String) map.get("sign");// 获取签名  
        String time_end = (String) map.get("time_end");//支付完成时间  
        String total_fee = (String) map.get("total_fee");// 获取订单金额  
        String trade_type = (String) map.get("trade_type");//交易类型  
        String transaction_id = (String) map.get("transaction_id");//微信支付订单号  
          
        User user = systemService.getUserByOpenId(openid);
        SortedMap<String, String> parameters = new TreeMap<String, String>();  
        // 数据加密  
        parameters.put("appid", appid);//应用ID  
        parameters.put("attach", attach);//商家数据包  
        parameters.put("bank_type", bank_type);//付款银行  
        parameters.put("cash_fee", cash_fee);//现金支付金额  
        parameters.put("fee_type", fee_type);//货币种类  
        parameters.put("is_subscribe", is_subscribe);//是否关注公众账号  
        parameters.put("mch_id", mch_id);//商户号  
        parameters.put("nonce_str", nonce_str);//随机字符串  
        parameters.put("openid", openid);//用户标识  
        parameters.put("out_trade_no", out_trade_no);// 商户订单号  
        parameters.put("result_code", result_code);// 业务结果  
        parameters.put("return_code", return_code);// SUCCESS/FAIL  
        parameters.put("time_end", time_end);// 支付完成时间  
        parameters.put("total_fee", total_fee);// 获取订单金额  
        parameters.put("trade_type", trade_type);//交易类型  
        parameters.put("transaction_id", trade_type);//微信支付订单号  
        
          
        /*System.out.println("**************************************************************************************************");  
        System.out.println(appid+"-------------------应用ID");  
        System.out.println(attach+"-------------------商家数据包");  
        System.out.println(bank_type+"-------------------付款银行");  
        System.out.println(cash_fee+"-------------------现金支付金额");  
        System.out.println(fee_type+"-------------------货币种类");  
        System.out.println(is_subscribe+"-------------------是否关注公众账号");  
        System.out.println(mch_id+"-------------------商户号");  
        System.out.println(nonce_str+"-------------------随机字符串");  
        System.out.println(openid+"-------------------用户标识");  
        System.out.println(out_trade_no+"-------------------获取商户订单号");  
        System.out.println(result_code+"-------------------业务结果");  
        System.out.println(return_code+"------------------- SUCCESS/FAIL");  
        System.out.println(sign+"-------------------获取签名-微信回调的签名");  
        System.out.println(time_end+"-------------------支付完成时间");  
        System.out.println(total_fee+"-------------------获取订单金额");  
        System.out.println(trade_type+"-------------------交易类型");  
        System.out.println(transaction_id+"-------------------微信支付订单号");  
        System.out.println("**************************************************************************************************");  
          */
  
        if (result_code.equals("SUCCESS")) {
            result = setXml("SUCCESS", "OK");  
        }else{
        result = setXml("fail", "微信返回的交易状态不正确(result_code=" + result_code + ")");  
        System.err.println("微信返回的交易状态不正确(result_code=" +result_code+ ")");  
        }
        // 如果微信返回的结果是success,则修改订单状态  
        if (return_code.equals("SUCCESS")) {
        result = setXml("SUCCESS", "OK");  
       
//这里是我的业务........................................
          
        }else{
        result = setXml("fail", return_code);
        }
        System.out.println("回调成功----返回给微信的xml:" + result);  
        return result;  
    }  
  
    //通过xml 发给微信消息  
    public static String setXml(String return_code, String return_msg) {  
        SortedMap<String, String> parameters = new TreeMap<String, String>();  
        parameters.put("return_code", return_code);  
        parameters.put("return_msg", return_msg);  
        return "<xml><return_code><![CDATA[" + return_code + "]]>" +   
                "</return_code><return_msg><![CDATA[" + return_msg + "]]></return_msg></xml>";  
    }  



配置域名千万检查清楚不能写错,虽然简单但是很致命,因为那是你很少再会去检查的地方  祝你好运

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/553405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中关村win11 32位全新官方版镜像v2021.07

中关村win11 32位全新官方版镜像v2021.07是一款全新的电脑系统&#xff0c;用户可以轻松感受到微软在新版本系统方面的强大性。无论开机菜单的实用性还是桌面的简洁性都给用户带来了全新的感受。系统自带多种类型的装机工具&#xff0c;可以让你的系统更加符合你的需求&#xf…

微信支付之企业付款(提现,理赔,退款)(java)

/*** 提现操作* throws Exception */RequestMapping("doCash")public String doTravelScoreCash(HttpServletRequest request) throws Exception {//微信企业付款 接口url https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfersString company_p…

ie浏览器剪贴板操作警告弹窗关闭方法

很多网友反应在使用浏览器复制东西的时候提示“确实允许此网页访问“剪贴板”吗?”&#xff0c;遇到这种情况该怎么办?如何去掉这个弹窗提示呢? ie浏览器剪贴板操作警告弹窗关闭方法[多图] 每次都弹出这个其实是有点烦的&#xff0c;那么如何解决这个问题呢&#xff0c;小…

微信CA证书(本例使用 java,win7服务器)

CA证书 微信支付HTTPS服务器证书验证指引https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter23_4 下载证书文件 DigiCert_Global_Root_CA.der官方安装步骤

Win11如何查看电池情况 Win11查看电池情况的方法

不少小伙伴在更新Win11系统后&#xff0c;不知道如何查看自己电脑的电池情况&#xff0c;也不知道到哪里改自己的电池使用方法&#xff0c;那么遇到这种问题应该怎么办呢?下面就和小编一起来看看应该怎么操作吧。 Win11查看电池情况的方法 1、首先我们点击下方的开始菜单&am…

div+css 单行或者多行超出文本,数字,字母长度自动省略

/* 超过两行 省略 */ .ellipsis{ margin:0; overflow:hidden; display:-webkit-box; -webkit-box-orient:vertical; text-overflow:ellipsis;-webkit-line-clamp:2;/* 当前第二行超出用省略号*/ word-break:break-all; }

Edge浏览器运行卡顿怎么办 怎样让Edge浏览器速度更快

在电脑上打开 Edge 浏览器。在 Edge 浏览器的地址栏输入 about:flags&#xff0c;回车。Edge浏览器运行卡顿怎么办&#xff1f;怎样让Edge浏览器速度更快[多图] 这时&#xff0c;浏览器会跳转到开发者设置页面。 Edge浏览器运行卡顿怎么办&#xff1f;怎样让Edge浏览器速度更…

ajax提交加载loading图标遮罩层不显示

代码片段 $("#backgroundLoadingId").show();//显示遮罩$.ajax({url:form.action,type:post,//async:false,//ajax同步时遮罩不会显示 遮罩层未在dom显示出来的时候&#xff0c;同步已经把浏览器卡住, 当ajax执行完毕执行之后的代码 $("#backgroundLoadingId&qu…

爱奇艺如何开启两指双击触发奇观功能

1、手机点击打开“爱奇艺”。 爱奇艺如何开启两指双击触发奇观功能 2、进入首页后&#xff0c;点击右下角“我的”。 爱奇艺如何开启两指双击触发奇观功能 3、跳转新页面后&#xff0c;查找并点击“设置”。 爱奇艺如何开启两指双击触发奇观功能 4、跳转新页面后&#xf…

查看eclipse 内存使用情况

windows-->preferences-->General show heap status 打上勾

ie浏览器自动清理缓存简单设置方法

1.在IE浏览器中点击工具&#xff0c;找到“Internet选项”。 ie浏览器自动清理缓存简单设置方法[多图] 2.打开“Internet选项”后如下图。 ie浏览器自动清理缓存简单设置方法[多图] 3.在选项卡中点击“高级”。然后找到“关闭浏览器时情况…”&#xff0c;在前选上。 ie浏…

tomcat7 加载el表达式 报错 使用tomcat8得以解决

<c:forEach items${[{"value":"1"},{"value":"2"},{"value":"3"}]} var"var" >

风林火山最新系统win11 32位旗舰版v2021.07

风林火山最新系统win11 32位旗舰版v2021.07是微软全新推出的电脑操作系统&#xff0c;这里款系统带来全新的功能&#xff0c;如任务栏居中&#xff0c;右键刷新等等&#xff0c;采用最实用、最纯粹的系统&#xff0c;轻松满足用户多样化的系统服务需求&#xff0c;有需要的朋友…

sap

eclipse sap 插件 http://tools.hana.ondemand.com/mars

Win11怎么从Dev渠道换Beta渠道?Win11从Dev渠道换Beta渠道的方法

Win11怎么从Dev渠道换Beta渠道?一般来说&#xff0c;beta渠道都要比dev渠道更加稳定可靠&#xff0c;bug和漏洞更少&#xff0c;因此很多在更新了dev渠道后&#xff0c;那么我们应该如何从Dev渠道换Beta频道呢?需要先退回原来的系统才能更换&#xff0c;下面很小编一起来看看…

大地最新win11 32位专业版镜像v2021.07

大地最新win11 32位专业版镜像v2021.07是微软全新推出的电脑操作系统&#xff0c;这里款系统带来全新的功能&#xff0c;如任务栏居中&#xff0c;右键刷新等等&#xff0c;采用最实用、最纯粹的系统&#xff0c;轻松满足用户多样化的系统服务需求&#xff0c;有需要的朋友们赶…

Win11怎么把任务栏调到左边 Win11任务栏在下面怎么调到左边

经常使用电脑的用户应该都熟悉屏幕中的任务栏&#xff0c;一般都会在整个屏幕的最下方&#xff0c;很多用户也都习惯了在最底下的任务栏。但是任务栏的位置其实可以改变&#xff0c;把任务栏调整到侧面可能可以获得一个更宽敞的桌面。所以有小伙伴问小编怎么把Win11系统的任务栏…

Win7电脑创建本地连接网络的操作方法

本地连接是指电脑中不同网络创建的连接&#xff0c;一般情况计算机有几个网卡就会出现几个本地连接。最近有不少小伙伴发现自己的电脑没有本地连接&#xff0c;想要创建又不知道怎么操作。今天小编就带着大家一起看看Win7电脑创建本地连接网络的操作方法吧! Win7电脑创建本地连…

傲游浏览器怎么快速保存图片 快速保存功能使用技巧分享

打开傲游浏览器&#xff0c;点击右上角的“三”字型图标&#xff0c;并在出现弹窗后选取【设置】; 傲游浏览器怎么快速保存图片&#xff1f;快速保存功能使用技巧分享 进入傲游设置页面后&#xff0c;在左侧的栏目项中点击“鼠标手势和快捷键”; 傲游浏览器怎么快速保存图片…

c:forecah 参数param 不能作为对象名

这样写不出数据 <c:forEach items"${listParam}" var"param"> 修改param可能也是个保留字,修改二其他对象名命名(例:param1 )可以显示${param1.name} 这样