微信支付开发流程及注意事项

来源:互联网 发布:vnc 客户端 windows 编辑:程序博客网 时间:2024/04/18 21:48

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工具构造【带XMLxml?】,也可以拼接。

6.回调等最好使用https协议增强安全性。

7.微信支付采用了先生成预支付订单的方式,如果用户在第一次支付生成预支付订单之后取消支付,那么重新发起支付就不能再生成一个预支付单,避免重复,所以需要在第一次保存住这个预支付订单。

8.公众号支付需要在微信公众号中做一些域名相关的设置【四项】和在商户平台的API安全中做apikey的设置。

 

9.APIKEY来自于商户平台,通过商户信息登录商户平台之后自己设置32个字符的密码。

10.公众号支付的时候支付方式为JSAPI,参数中必须带上openid,即用户的微信号在微信公众号中的唯一标识。

获取这个openid需要通过oauth2授权,流程如下:

提交订单,然后跳转到授权页面

window.location.href="../h5/Order/wxpayAuth?tradeId="+tradeId;

授权处理,参数tradeId通过state传递

StringtradeId = 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

        Stringcode = 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");

            StringtokenJson ="";

            try{

                tokenJson =HttpUtil.getHttpByGet("https://api.weixin.qq.com/sns/oauth2/access_token",tokenmap);

            }

            catch(Exceptione){

                e.printStackTrace();

                return;

            }

            JSONObjectdata = JSON.parseObject(tokenJson);

            JSONObjectobject = getOrderInfo(tradeId);            object.put("tradeId",tradeId);

            object.put("openid",data.getString("openid"));

 

           Stringreturn_url = SystemConfigUtil.getSystemConfig().getHostPrefix() + JFinal.me().getContextPath()

                    +"/website/wxpay.html";

           try{

                getResponse().sendRedirect(return_url +"?result=" + URLEncoder.encode(object.toString()));

            }

            catch(IOExceptione){

               e.printStackTrace();

            }

        }

参考资料:

微信开放平台官方资料

方培工作室:微信网页支付

0 0
原创粉丝点击