问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

微信移动支付时用官方给的例子吗

发布网友 发布时间:2022-04-20 22:32

我来回答

2个回答

热心网友 时间:2022-05-18 23:03

微信支付jsapi(java版),具体代码如下:

代码太多,更多代码请访问http://www.vxzsk.com/394.html
1. 项目使用springmvc restful风格的,需要用到jar包请自行下载
2. 整个项目只需要修改com.tenpay.configure.WxPayConfig中的配置信息就行。
 
// appid
public static String APP_ID = "公众id";
// JSAPI接口中获取openid,审核后在公众平台开启开发模式后可查看
public static String APP_SECRET = "公众号中的秘钥";
// 受理商ID,身份标识
public static String MCH_ID = "商户id";
// 商户支付密钥Key,装完整数后,配置得到。32位长度
public static String KEY = "商户平台中配置证书,设置的秘钥";
// 异步回调地址
public static String NOTIFY_URL = "支付成功后的回调action";
public static String CHARTSET = "UTF-8";
// 加密方式
public static String SIGN_TYPE = "MD5";
// redirect_uri,微信授权重定向地址
public static String REDIRECT_URI;
 
static {
    try {
        REDIRECT_URI = URLEncoder.encode("微信授权成功后重定向的action", CHARTSET);
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
}
 
3. 项目核心类com.tenpay.action.WxPayAction
pay函数:支付前准备函数,从数据库获取订单号,查询订单金额,订单描述、openid、prepay_id等等。
notify函数:支付成功后异步回调函数。

一、新建基于springMVC框架的javaweb项目名字为wxPay

二、java代码实现

2.1 com.tenpay.action.WxPayAction代码

package com.tenpay.action;
 
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.jdom2.JDOMException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
 
import com.tenpay.RequestHandler;
import com.tenpay.configure.WxPayConfig;
import com.tenpay.service.ServiceUtil;
import com.tenpay.util.MD5Util;
import com.tenpay.util.Sha1Util;
import com.tenpay.util.XMLUtil;
 
import net.sf.json.JSONObject;
 
/*******************************************************************************
 * <b>类名: WxPayAction.java</b> <br/>
 * 功能:微信支付,调用jsapi<br/>
 * 日期:<br/>
 * 
 * @author V型知识库 www.vxzsk.com
 * @version 1.0
 * 
 ******************************************************************************/
@Controller
@RequestMapping("/v_3")
public class WxPayAction {
     
    /**
     * 微信客户端授权成功后根据redirect_uri参数调整到pay接口,去准备支付前信息接口
     * @param request
     * @param response
     * @return
     * @throws Exception
     */
    @RequestMapping("pay")
    public String order(HttpServletRequest request, HttpServletResponse response) throws Exception {
        /**
         * 第一步:用户同意授权,根据参数,获取code
         * 授权成功后返回的授权码,参考:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html#.E7.AC.AC.E4.B8.80.E6.AD.A5.EF.BC.9A.E7.94.A8.E6.88.B7.E5.90.8C.E6.84.8F.E6.8E.88.E6.9D.83.EF.BC.8C.E8.8E.B7.E5.8F.96code
         */
        String code = request.getParameter("code");
        String state = request.getParameter("state");
         
        // state可以为任何含义,根据你前端需求,这里暂时叫商品id
        // 授权码、商品id
        System.out.println("code=" + code + ",state=" + state);
         
        /**
         * 第二步:通过code换取网页授权access_token
         * 根据授权码code获取access_token,参考:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html#.E7.AC.AC.E4.BA.8C.E6.AD.A5.EF.BC.9A.E9.80.9A.E8.BF.87code.E6.8D.A2.E5.8F.96.E7.BD.91.E9.A1.B5.E6.8E.88.E6.9D.83access_token
         */
        // 下面就到了获取openid,这个代表用户id.
        // 获取openID
        String openid = ServiceUtil.getOpenId(code);
        // 生成随机字符串
        String noncestr = Sha1Util.getNonceStr();
        // 生成1970年到现在的秒数.
        String timestamp = Sha1Util.getTimeStamp();
        // 订单号,自定义生成规则,只要全局唯一就OK
        String out_trade_no = "NO" + System.currentTimeMillis() + "0001";
        // 订单金额,应该是根据state(商品id)从数据库中查询出来
        String order_price = String.valueOf(1);
        // 商品描述,应该是根据state(商品id)从数据库中查询出来
        String body = "商品描述,测试....";
         
        /**
         * 第三步:统一下单接口
         * 需要第二步生成的openid,参考:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
         */
        RequestHandler reqHandler = new RequestHandler(request, response);
        // 初始化 RequestHandler 类可以在微信的文档中找到.还有相关工具类
        reqHandler.init();
        // 执行统一下单接口 获得预支付id,一下是必填参数
         
        // 微信分配的公众账号ID(企业号corpid即为此appId)
        reqHandler.setParameter("appid", WxPayConfig.APP_ID); 
        // 微信支付分配的商户号
        reqHandler.setParameter("mch_id", WxPayConfig.MCH_ID); 
        // 终端设备号(门店号或收银设备ID),注意:PC网页或公众号内支付请传"WEB"
        reqHandler.setParameter("device_info", "WEB"); 
        // 随机字符串,不长于32位。推荐随机数生成算法
        reqHandler.setParameter("nonce_str", noncestr); 
        // 商品描述
        reqHandler.setParameter("body", body); 
        // 商家订单号
        reqHandler.setParameter("out_trade_no", out_trade_no); 
        // 商品金额,以分为单位
        reqHandler.setParameter("total_fee", order_price); 
        // APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP。
        reqHandler.setParameter("spbill_create_ip", "123.57.58.123"); 
        // 下面的notify_url是用户支付成功后为微信调用的action 异步回调.
        reqHandler.setParameter("notify_url", WxPayConfig.NOTIFY_URL);
        // 交易类型,取值如下:JSAPI,NATIVE,APP,详细说明见参数规定
        reqHandler.setParameter("trade_type", "JSAPI");
        // ------------需要进行用户授权获取用户openid-------------
        reqHandler.setParameter("openid", openid); // 这个必填.
        /*
         * <xml><appid>wx2421b1c4370ec43b</appid><attach>支付测试</attach><body>
         * JSAPI支付测试</body><mch_id>10000100</mch_id><nonce_str>
         * 1add1a30ac87aa2db72f57a2375d8fec</nonce_str><notify_url>http://wxpay.
         * weixin.qq.com/pub_v2/pay/notify.v2.php</notify_url><openid>
         * oUpF8uMuAJO_M2pxb1Q9zNjWeS6o</openid><out_trade_no>1415659990</
         * out_trade_no><spbill_create_ip>14.23.150.211</spbill_create_ip><
         * total_fee>1</total_fee><trade_type>JSAPI</trade_type><sign>
         * 0CB01533B8C1EF103065174F50BCA001</sign></xml>
         */
        // 生成签名,并且转为xml
        String requestXml = reqHandler.getRequestXml();
        System.out.println("requestXml:" + requestXml);
 
        // 得到的预支付id
        String prepay_id = ServiceUtil.unifiedorder(requestXml);
        SortedMap<String, String> params = new TreeMap<String, String>();
        params.put("appId", WxPayConfig.APP_ID);
        params.put("timeStamp", timestamp);
        params.put("nonceStr", noncestr);
        params.put("package", "prepay_id=" + prepay_id);
        params.put("signType", "MD5");
 
        System.out.println("params:" + JSONObject.fromObject(params).toString());
         
        // 生成支付签名,这个签名 给 微信支付的调用使用
        SortedMap<Object,Object> signMap = new TreeMap<Object,Object>();
        signMap.put("appId", WxPayConfig.APP_ID); 
        signMap.put("timeStamp", timestamp);
        signMap.put("nonceStr", noncestr);
        signMap.put("package", "prepay_id=" + prepay_id);
        signMap.put("signType", "MD5");
         
        // 微信支付签名
        String paySign = MD5Util.createSign(signMap, WxPayConfig.KEY);
        System.out.println("PaySIGN:" + paySign);
         
        //微信分配的公众账号ID(企业号corpid即为此appId)
        request.setAttribute("appId", WxPayConfig.APP_ID);
        // 时间戳
        request.setAttribute("timeStamp", timestamp); 
        // 随机字符串
        request.setAttribute("nonceStr", noncestr); 
        // 预支付id ,就这样的格式
        request.setAttribute("package", "prepay_id=" + prepay_id);
        // 加密格式
        request.setAttribute("signType", WxPayConfig.SIGN_TYPE); 
        // 微信支付签名
        request.setAttribute("paySign", paySign);
        return "pay";
    }
 
    /**
     * 异步返回
     */
    @RequestMapping("notify")
    public String notify(HttpServletRequest request, HttpServletResponse response) {
        try {
 
            InputStream inStream = request.getInputStream();
            ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = inStream.read(buffer)) != -1) {
                outSteam.write(buffer, 0, len);
            }
            outSteam.close();
            inStream.close();
            String resultStr = new String(outSteam.toByteArray(), WxPayConfig.CHARTSET);
            Map<String, String> resultMap = XMLUtil.doXMLParse(resultStr);
             
            System.out.println("微信回调结果:" + resultMap.toString());
             
            String result_code = resultMap.get("result_code");
            String is_subscribe = resultMap.get("is_subscribe");
            String out_trade_no = resultMap.get("out_trade_no");
            String transaction_id = resultMap.get("transaction_id");
            String sign = resultMap.get("sign");
            String time_end = resultMap.get("time_end");
            String bank_type = resultMap.get("bank_type");
            String return_code = resultMap.get("return_code");
            // 签名验证
//          GenericValue userLogin = delegator.findOne("UserLogin", UtilMisc.toMap("userLoginId", "admin"), false);
            if (return_code.equals("SUCCESS")) {
                // 此处就是你的逻辑代码
                // 修改数据库支付状态
            }
            request.setAttribute("out_trade_no", out_trade_no);
            // 通知微信.异步确认成功.必写.不然会一直通知后台.八次之后就认为交易失败了.
            response.getWriter().write(RequestHandler.setXML("SUCCESS", ""));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JDOMException e) {
            e.printStackTrace();
        }
        return "notify";
    }
}

热心网友 时间:2022-05-19 00:21

对。参数已经给你设定好了你只需要网里面传参行了来自:求助得到的回答
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
seiko开头的手表是什么牌子(手表seiko是啥品牌) seiko什么牌子? SEIKO 手表中文名字 是什么? seiko的手表是什么牌子(seiko的手表是什么牌子的) sekro手表是什么牌子? 将神符石怎么合成 QQ华夏里怎样才能做出一件完美的装备,做装备的过程又是怎样的?_百度知 ... QQ华夏用符石提升装备有什么技巧没有? QQ华夏怎么合成一件厉害的装备?详细 云南反渗透净水设备批发公司 手机微信支付网络环境未能通过安全验证,怎么支付? 可转债转股怎么操作 微信返回36位预支付可是调起支付又要求32位 怎么办 ecshop 微信支付成功 但是订单状态还是未付款,求... 可转债转股怎么算多少股 微信支付 扫码模式二 支付完成后是如何给微信返回... 手机微信支付网络环境未能通过安全验证,怎么支付不了 手机工行商户之家,收款没有语音提示音,怎,解决 如何用PHP实现微信支付,求教。新手!说明详细点 微信支付中支付完后显示微信支付2是怎么回事? 微信支付异步通知的回传参数为空 微信扫码支付模式二回调怎么处理 thinkphp 微信支付回调是什么反应 微信支付接口php版 notify_url.php 异步通知页面未... 微信v3扫码支付二返回的notify.php怎么接收回调的值 thinkpad0A36414 双击无效,是为什么。其他鼠标双... 鼠标双击失灵怎么办 鼠标双击操作无效 华为双击截屏失效 应用程序双击无效,右键没有“打开”选项。 可转债转股对股价有影响吗 统一支付接口中 缺少必填参数是什么意思 微信支付 异步通知怎么拿到微信的数据 可转债如何转换成股票 可转债转股能否多次申购? java 微信支付异步通知可以加端口吗 可转债转股如何操作 可转债转股的转股时机是什么?什么时候转股? 转债涨到150转股怎么转 可转债的转股价和转股价值区别是什么? 怎么把机械硬盘换固态 旧台式电脑怎么把硬盘拆下来 然后安装到别的台式电... 我这个机械硬盘要怎么拆下来,求拆除过程! 怎么把家里的2T机械硬盘,拆卸下来,再安装到新的... 请问这种品牌机的机械硬盘如何拆下?图中那两个螺... 大神,这个机械硬盘怎么拆的 苏打饼干是酸性还是碱性的 苏打饼是碱性还是酸性食物 苏打饼干是碱性的吗 苏打饼干是碱性的食品吗
  • 焦点

最新推荐

猜你喜欢

热门推荐