微信支付demo教程

2025-10-31 08:00:12

1、下面说说这几个步骤:

1、access_token的获取

因为access_token的获取有请求频的限制,只能固化到数据库中了。这个不是难题。

微信支付demo教程

2、生成预支付订单

在微信支付Android的接口文档开头有提到:

注意:appsecret、appkey、partnerkey 不应硬编码到客户端程序中,建议需要用到这三个字段的过程都在服务器端完成

微信支付demo教程

3、故此过程所有的信息全部在服务端生成。那么问题来了?挖掘机.... kao, 应该是,如何生成?

在翻看服务端的demo中,有jsp文件夹。打开一看,都几乎可以直接搬运使用了。

实现该过程的文件:payRequest.jsp

如何在Java中实现上面jsp的请求?项目中用到了spring MVC,代码如下:

微信支付demo教程

4、[java] view plain copy

@Controller  

@RequestMapping("/weixin/")  

public class WeiXinPayController extends ResponsePage  {  

  

    private Logger log = Logger.getLogger(WeiXinPayController.class);  

      

    @RequestMapping("weixin.do")  

    public String doWeinXinRequest(HttpServletRequest request,HttpServletResponse response) throws Exception {  

        Map<Object,Object> resInfo = new HashMap<Object, Object>();  

        //接收财付通通知的URL  

        String notify_url = "http://127.0.0.1:8180/tenpay_api_b2c/payNotifyUrl.jsp";  

  

        //---------------生成订单号 开始------------------------  

        //当前时间 yyyyMMddHHmmss  

        String currTime = TenpayUtil.getCurrTime();  

        //8位日期  

        String strTime = currTime.substring(8, currTime.length());  

        //四位随机数  

        String strRandom = TenpayUtil.buildRandom(4) + "";  

        //10位序列号,可以自行调整。  

        String strReq = strTime + strRandom;  

        //订单号,此处用时间加随机数生成,商户根据自己情况调整,只要保持全局唯一就行  

        String out_trade_no = strReq;  

        //---------------生成订单号 结束------------------------  

  

        PackageRequestHandler packageReqHandler = new PackageRequestHandler(request, response);//生成package的请求类   

        PrepayIdRequestHandler prepayReqHandler = new PrepayIdRequestHandler(request, response);//获取prepayid的请求类  

        ClientRequestHandler clientHandler = new ClientRequestHandler(request, response);//返回客户端支付参数的请求类  

        packageReqHandler.setKey(ConstantUtil.PARTNER_KEY);  

  

        int retcode ;  

        String retmsg = "";  

        String xml_body = "";  

        //获取token值   

          

        String token = AccessTokenRequestHandler.getAccessToken();  

          

        log.info("获取token------值 " + token);  

          

        if (!"".equals(token)) {  

            //设置package订单参数  

            packageReqHandler.setParameter("bank_type", "WX");//银行渠道  

            packageReqHandler.setParameter("body", "测试"); //商品描述     

            packageReqHandler.setParameter("notify_url", notify_url); //接收财付通通知的URL    

            packageReqHandler.setParameter("partner", ConstantUtil.PARTNER); //商户号      

            packageReqHandler.setParameter("out_trade_no", out_trade_no); //商家订单号     

            packageReqHandler.setParameter("total_fee", "1"); //商品金额,以分为单位    

            packageReqHandler.setParameter("spbill_create_ip",request.getRemoteAddr()); //订单生成的机器IP,指用户浏览器端IP    

            packageReqHandler.setParameter("fee_type", "1"); //币种,1人民币   66  

            packageReqHandler.setParameter("input_charset", "GBK"); //字符编码  

  

            //获取package包  

            String packageValue = packageReqHandler.getRequestURL();  

            resInfo.put("package", packageValue);  

              

            log.info("获取package------值 " + packageValue);  

  

            String noncestr = WXUtil.getNonceStr();  

            String timestamp = WXUtil.getTimeStamp();  

            String traceid = "";  

            ////设置获取prepayid支付参数  

            prepayReqHandler.setParameter("appid", ConstantUtil.APP_ID);  

            prepayReqHandler.setParameter("appkey", ConstantUtil.APP_KEY);  

            prepayReqHandler.setParameter("noncestr", noncestr);  

            prepayReqHandler.setParameter("package", packageValue);  

            prepayReqHandler.setParameter("timestamp", timestamp);  

            prepayReqHandler.setParameter("traceid", traceid);  

  

            //生成获取预支付签名  

            String sign = prepayReqHandler.createSHA1Sign();  

            //增加非参与签名的额外参数  

            prepayReqHandler.setParameter("app_signature", sign);  

            prepayReqHandler.setParameter("sign_method",  

                    ConstantUtil.SIGN_METHOD);  

            String gateUrl = ConstantUtil.GATEURL + token;  

            prepayReqHandler.setGateUrl(gateUrl);  

  

            //获取prepayId  

            String prepayid = prepayReqHandler.sendPrepay();  

              

            log.info("获取prepayid------值 " + prepayid);  

              

            //吐回给客户端的参数  

            if (null != prepayid && !"".equals(prepayid)) {  

                //输出参数列表  

                clientHandler.setParameter("appid", ConstantUtil.APP_ID);  

                clientHandler.setParameter("appkey", ConstantUtil.APP_KEY);  

                clientHandler.setParameter("noncestr", noncestr);  

                //clientHandler.setParameter("package", "Sign=" + packageValue);  

                clientHandler.setParameter("package", "Sign=WXPay");  

                clientHandler.setParameter("partnerid", ConstantUtil.PARTNER);  

                clientHandler.setParameter("prepayid", prepayid);  

                clientHandler.setParameter("timestamp", timestamp);  

                //生成签名  

                sign = clientHandler.createSHA1Sign();  

                clientHandler.setParameter("sign", sign);  

  

                xml_body = clientHandler.getXmlBody();  

                resInfo.put("entity", xml_body);  

                retcode = 0;  

                retmsg = "OK";  

            } else {  

                retcode = -2;  

                retmsg = "错误:获取prepayId失败";  

            }  

        } else {  

            retcode = -1;  

            retmsg = "错误:获取不到Token";  

        }  

          

        resInfo.put("retcode", retcode);  

        resInfo.put("retmsg", retmsg);  

        String strJson = JSON.toJSONString(resInfo);  

        return responseAjax(request, strJson);  

    }  

      

}  

微信支付demo教程

5、最后,微信回调:可以参考jsp文件夹中的payNotifyUrl.jsp来处理,处理过程和上面第二步差不多

微信支付demo教程

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢