微信支付

来源:互联网 发布:pk10挂机软件手机软件 编辑:程序博客网 时间:2024/05/29 08:23
1.支付能力介绍:
刷卡支付是用户展示微信钱包内的“刷卡条码/二维码”给商户系统扫描后直接完成支付的模式。主要应用线下面对面收银的场景。


扫码支付扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于PC网站支付、实体店单品或订单支付、媒体广告支付等场景。


公众号支付公众号支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付。应用场景有:


◆ 用户在微信公众账号内进入商家公众号,打开某个主页面,完成支付


◆ 用户的好友在朋友圈、聊天窗口等分享商家页面连接,用户点击链接打开商家页面,完成支付


◆ 将商户页面转换成二维码,用户扫描二维码后在微信浏览器中打开页面后完成支付


APP支付APP支付又称移动端支付,是商户通过在移动端应用APP中集成开放SDK调起微信支付模块完成支付的模式。
2.支付流程
步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。

步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。参见【统一下单API】。

步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。
注意:package的值格式为Sign=WXPay

步骤4:商户APP调起微信支付。api参见本章节【app端开发步骤说明】

步骤5:商户后台接收支付通知。api参见【支付结果通知API】

步骤6:商户后台查询支付结果。,api参见【查询订单API】


 
 
服务器需要返回给客户端的信息
"Data":{
"appid":"wxa7d1ec77cbf51cef",
"msg":"ok",
"noncestr":"MS40NzI2NTQ4NjI1OTMzMDQ4RTg=",
"package":"Sign=WXPay",
"partnerid":"1363835302",
"prepayid":"wx2016083122474134e6c61e8d0821148219",
"sign":"D6BEF6E1CE646B37DD6680924D4E81D5",
"timestamp":"1472654863"
}
 
【注意事项】
1.公众号支付只能在微信环境中使用,普通的浏览器不支持,因为其使用了他的私有js对象。
2.公众号支付和App支付对应不同的商户号,这点管理起来可能不太方便。
3.交易金额默认为人民币交易,接口中参数支付金额单位为【分】,参数值不能带小数。对账单中的交易金额单位为【元】。外币交易的支付金额精确到币种的最小单位,
参数值不能带小数点。
4.公众号支付和App支付使用的某些键有时候是下划线,有时候又是驼峰,特别需要注意。
5.微信支付更多使用XML构造协议数据,可以使用XML工具构造【带XML头xml?】,也可以拼接。
6.回调等最好使用https协议增强安全性。
7.微信支付采用了先生成预支付订单的方式,如果用户在第一次支付生成预支付订单之后取消支付,那么重新发起支付就不能再生成一个预支付单,避免重复,
所以需要在第一次保存住这个预支付订单。
8.公众号支付需要在微信公众号中做一些域名相关的设置【四项】和在商户平台的API安全中做apikey的设置。
 






9.APIKEY来自于商户平台,通过商户信息登录商户平台之后自己设置32个字符的密码。
10.公众号支付的时候支付方式为JSAPI,参数中必须带上openid,即用户的微信号在微信公众号中的唯一标识。
获取这个openid需要通过oauth2授权,流程如下:
①提交订单,然后跳转到授权页面
window.location.href="../h5/Order/wxpayAuth?tradeId="+tradeId;
②授权处理,参数tradeId通过state传递
String tradeId = getPara("tradeId");        String oauth2URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + WxpayConfig.APPID_HTML
                + "&redirect_uri=" + SystemConfigUtil.getSystemConfig().getHostPrefix() + JFinal.me().getContextPath()
                + "/h5/Order/wxpayAuth" + "&response_type=code&scope=snsapi_base&state=" + tradeId + "#wechat_redirect";
        // 1.获取用户code
        String code = getPara("code");        if(StrKit.isBlank(code)){// 不存在就触发微信的调用
            HandlerKit.redirect301(oauth2URL, getRequest(), getResponse(), new boolean[1]);
        } else{
            tradeId = getPara("state");
            HashMap<String, Object> tokenmap = new HashMap<String, Object>();
            tokenmap.put("appid", WxpayConfig.APPID_HTML);
            tokenmap.put("secret", WxpayConfig.SECRET_HTML);
            tokenmap.put("code", code);
            tokenmap.put("grant_type", "authorization_code");
            String tokenJson = "";
            try{
                tokenJson = HttpUtil.getHttpByGet("https://api.weixin.qq.com/sns/oauth2/access_token", tokenmap);
            }
            catch(Exception e){
                e.printStackTrace();
                return;
            }
            JSONObject data = JSON.parseObject(tokenJson);
            JSONObject object = getOrderInfo(tradeId);            object.put("tradeId", tradeId);
            object.put("openid", data.getString("openid"));
 
           String return_url = SystemConfigUtil.getSystemConfig().getHostPrefix() + JFinal.me().getContextPath()
                    + "/website/wxpay.html";
           try{
                getResponse().sendRedirect(return_url + "?result=" + URLEncoder.encode(object.toString()));
            }
            catch(IOException e){
               e.printStackTrace();
            }
        }





原创粉丝点击