微信支付jsapi

微信支付jsapi

订单表
订单列表
支付界面
商户已有H5商城网站,用户通过消息或扫描二维码在微信内打开网页时,可以调用微信支付完成下单购买的流程。

开发步骤

技术博客

jspi支付,是指微信公众号里面的打开网站,支付

大致流程

  1. 获取所需参数
  2. 发送给统一下单的接口
  3. 根据返回的参数,进行解析,如果成功,将部分参数发送给前台。注意前台的浏览器是微信内置浏览器,有一个内置的js对象,可以通过js对象,调起支付
  4. 最后跳转到结果页面

正式开发

jsapi统一下单api列表
下面列举必须字段

Appid,mch_id,nonce_str,sign,body,out_trade_no,total_fee,spbill_create_ip,notify_url,trade_type,openid

注意:total_fee是分为单位

String total_fee = info.getOrderMoney().multiply(new BigDecimal("100")).intValue()+"";

说下不好获取的

spbill_create_ip:我当时就是写了127.0.0.1,我并不清楚怎么获取

notify_url:写公网可以访问的地址,最好去看下官网的介绍,

out_trade_no:前6位是随机数,后面是数据库中实际的订单编号,这样是为了回调的时候获取订单编号,当然也可以使用别的方法。

openid:是指一个用户到一个公众号,对应的一个key,是唯一的,获取方法文档

我的思路是,先获取code,H5界面里面,有一个去支付按钮,而去支付按钮是一个超链接

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx1111111111111111&redirect_uri=http%3A%2F%2Fm.XXXX.com%2FpayList.html%3ForderNumber%3D"+orderNum+"&response_type=code&scope=snsapi_base&state=123#wechat_redirect";

这里面的redirect_uri需要格式化

import java.net.URLEncoder;
String formatUrl = URLEncoder.encode("http://m.XXXX.com/payList.html?orderNumber=XXXXXXX","UTF_8");

跳转回来的时候是

http://m.XXXX.com/payList.html?orderNumber=XXXXXXX&code=sdhjsdhfjhasjhfhjasdhbavbnb

这个code呢,你开发在电脑端是看不见的,这也就是微信坑的地方,所以你 下载微信开发者工具

获取code之后,点击微信支付,发送ajax请求给后台

@RequestMapping("/payH5")
    @ResponseBody
    public Object payH5(@RequestParam("orderNumber") String orderNumber, @RequestParam("type") Integer type, HttpServletRequest request, HttpServletResponse response,@RequestParam(value = "code",defaultValue = "")String code) throws Exception{
        try{

            OrderInfo info = orderInfoService.selectOne(new EntityWrapper<OrderInfo>()
                    .eq("order_number", orderNumber));
            ModelAndView modelAndView = new ModelAndView();
            //支付宝支付
            if(type.intValue()==1){
               response.sendRedirect("http://m.XXXX.com/alipay.html?orderNumber="+orderNumber);

                //微信支付
            }else if(type.intValue()==0){
                if("".equals(code)){
                   return "返回错误界面";
                }
                WxpayConfig wxpayConfig = new WxpayConfig();

                //此处获取openid,后台发请求给,通过code,appId,appsecret
                String res = HttpUtil.sendGet("https://api.weixin.qq.com/sns/oauth2/access_token",
                        "appid="+wxpayConfig.getApp_id()+"&secret="+wxpayConfig.getApp_secret()+"&code="+code+"&grant_type=authorization_code");
                JSONObject json = JSONObject.parseObject(res);
                String openId = json.getString("openid");
                Map<String,String> paraMap = new HashMap<>();
                paraMap.put("appid",wxpayConfig.getApp_id());
                paraMap.put("body",info.getOrderProject());
                paraMap.put("mch_id",wxpayConfig.getMch_id());
                paraMap.put("nonce_str", WXPayUtil.generateNonceStr());
                paraMap.put("openid",openId);
                String randomNum = (int)((Math.random()*9+1)*100000)+"";
                String orderNo =randomNum+orderNumber;
                paraMap.put("out_trade_no",orderNo);
                paraMap.put("spbill_create_ip",wxpayConfig.getSpbill_create_ip());
                String total_fee = info.getOrderMoney().multiply(new BigDecimal("100")).intValue()+"";
                paraMap.put("total_fee",total_fee);
                paraMap.put("trade_type",wxpayConfig.getTrade_type());
                paraMap.put("notify_url","http://XXXX.com/XXXX/api/wxnotify?orderNumber="+orderNumber);
                String apiKey = wxpayConfig.getApi_key();
                String sign = WXPayUtil.generateSignature(paraMap,apiKey);
                paraMap.put("sign",sign);
                String xml = WXPayUtil.mapToXml(paraMap);
                //统一下单 https://api.mch.weixin.qq.com/pay/unifiedorder
                String unifiedorder_url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
                String xmlStr = HttpUtil.sendPost(unifiedorder_url,xml,false);
                //以下内容是返回前端页面的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", wxpayConfig.getApp_id());
                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, wxpayConfig.getApi_key());
                payMap.put("paySign", paySign);
                return payMap;
            }
            return "";

        }catch (Exception e){
            e.printStackTrace();
        }
        return "end";
//        return new SuccessResponseData();
    }

获取sign

获取sign

下载后,里面有一些工具类,WXPayUtil里面有一个方法可以获取

返回数据到前台后,前台调用js对象,执行

 WeixinJSBridge.invoke( 'getBrandWCPayRequest', {
                "appId":appId,     //公众号名称,由商户传入
                "timeStamp":timeStamp,         //时间戳,自1970年以来的秒数
                "nonceStr":nonceStr, //随机串
                "package":package,
                "signType":signType,         //微信签名方式:
                "paySign":paySign //微信签名
            }, function(res){
                console.log(res);
                window.location.href = "http://m.XXXX.com/orderDetail.html?orderNum="+orderNumber;
                // if(res.err_msg == "get_brand_wcpay_request:ok" ) {
                //     console.log('支付成功');
                //     //支付成功后跳转的页面
                // }else if(res.err_msg == "get_brand_wcpay_request:cancel"){
                //     console.log('支付取消');
                // }else if(res.err_msg == "get_brand_wcpay_request:fail"){
                //     console.log('支付失败');
                // } //使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
}

就会执行微信支付,不管成功没有,都会跳转到orderDetail界面,查看order详情

微信回调

微信会返回结果

我应该处理什么

  1. 告诉微信,我收到了,返回success
  2. 对订单信息,获取orderNum,对订单状态进行更新
@RequestMapping("/wxnotify")
public String wxnotify(HttpServletRequest request,HttpServletResponse response){
    InputStream is = null;
    try{
    is = request.getInputStream();
    String xml = WXPayUtil.inputStream2String(is);
    Map<String,String> notifyMap = WXPayUtil.xmlToMap(xml);
    if(notifyMap.get("return_code").equals("SUCCESS")) {
    String orderNumber = notifyMap.get("out_trade_no").substring(6);
    OrderInfo info = orderInfoService.selectOne(new EntityWrapper<OrderInfo>()
    .eq("order_number", orderNumber));
    info.setOrderState(1);
    orderInfoService.updateById(info);
    String amount = notifyMap.get("total_fee");
    System.out.println("实际付款:"+amount);
    }
    response.getWriter().write("<xml><return_code><![CDATA[SUCCESS]]></return_code></xml>");
    is.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    return null;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Uniapp是一种跨平台的开发框架,可以用于同时开发iOS、Android和H5应用。而H5是指在网页上运行的应用程序。微信支付JSAPI是微信提供的一种支付接口,通过调用JSAPI接口,可以在H5应用中实现微信支付功能。 在Uniapp中使用微信支付JSAPI,可以通过以下步骤进行操作: 1. 首先,在Uniapp项目中引入微信支付的相关配置文件和SDK库文件。 2. 在需要使用微信支付的页面中,引入微信支付的JS文件,并初始化微信支付参数。支付参数包括商户号、appid、签名等信息。 3. 创建统一下单接口的后端处理程序,用于生成预支付订单并返回支付预处理参数给前端。 4. 在支付页面中,调用微信支付JSAPI的方法,传入预支付处理参数和支付回调方法。 5. 当用户点击支付按钮后,会弹出微信支付界面,用户可以选择支付方式进行支付操作。 6. 支付成功后,微信会将支付结果返回给前端,并通过支付回调方法进行处理,可以展示支付成功的提示信息和更新订单状态等操作。 需要注意的是,使用微信支付JSAPI需要在微信开放平台上注册并申请相关的权限。同时,在使用过程中,还需要确保支付参数的正确性、支付安全性和业务逻辑的完善性。 总之,Uniapp可以很好地支持H5应用中的微信支付JSAPI,通过合理的配置和调用,可以方便地在H5应用中实现微信支付功能,为用户提供更加便捷的支付体验。 ### 回答2: Uniapp是一款跨平台的应用开发框架,可以让开发者使用Vue.js语法来开发同时兼容多个平台的应用程序。Uniapp支持在H5平台中使用微信支付JSAPI。 微信支付JSAPI是微信提供的一组用于在网页中实现微信支付功能的JavaScriptAPI接口。通过调用微信支付JSAPI,开发者可以在H5页面中调起微信支付功能,用户可以使用微信支付完成支付操作。 在Uniapp中使用微信支付JSAPI,首先需要引入微信支付的JS文件。可以在页面的头部引入:<script src="https://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>。 然后,在需要使用微信支付的地方,可以通过uni.request方法向服务器请求获取支付参数。获取到支付参数后,可以使用wx.requestPayment方法调起微信支付界面,并传入支付参数。支付成功后,微信会返回支付结果给开发者的回调函数,开发者可以在回调函数中处理支付结果。 需要注意的是,在使用微信支付JSAPI的过程中需要保证支付参数的安全性,避免支付参数被恶意篡改。通常可以在服务器端生成支付参数,并通过服务器端返回给前端,以确保支付参数的安全性。 总结起来,Uniapp可以在H5平台中使用微信支付JSAPI来实现微信支付功能,开发者需要引入微信支付的JS文件,通过uni.request方法获取支付参数,调用wx.requestPayment方法调起支付,处理支付结果的回调函数,并确保支付参数的安全性。 ### 回答3: Uniapp 是一款跨平台开发框架,可以同时开发小程序、H5 和APP。Uniapp 提供了对微信支付的支持,可以使用微信支付的 JSAPI(JavaScript API)来进行支付功能的开发。 Uniapp H5 微信支付 JSAPI 的实现过程如下: 1. 首先,需要在微信支付商户平台上注册并获取到自己的商户号(mch_id),同时生成随机字符串(nonce_str)和当前时间戳(timestamp)。 2. 接下来,在前端页面中引入微信支付的 JS 文件,可以通过在页面头部添加以下代码进行引入: ``` <script src="https://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script> ``` 3. 在页面中设置要支付的订单信息,包括订单号(out_trade_no)、订单总金额(total_fee)等,并将这些信息以及商户号、随机字符串和时间戳等传递给后端服务器。 4. 后端服务器在接收到前端传递的支付信息后,根据微信支付 API 的要求,生成签名(sign)并返回给前端。 5. 前端页面收到后端返回的签名后,调用微信支付的 JSAPI 方法,传入订单信息和签名等参数,即可发起支付请求。 6. 微信客户端会弹出支付窗口,用户输入密码或进行指纹验证后,支付完成。 注意事项: - 在使用 Uniapp 进行微信支付开发时,需要确保页面已经获得了微信公众号的授权,因为微信支付是需要通过公众号的权限进行的。 - 需要合理处理支付结果的回调,根据支付结果进行相应的处理,如跳转到支付成功页面或给予支付失败的提示等。 通过使用 Uniapp H5 微信支付 JSAPI,我们可以方便地在 Uniapp 框架下进行微信支付的开发,实现支付功能的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值