微信支付
来源:互联网 发布: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();
}
}
刷卡支付是用户展示微信钱包内的“刷卡条码/二维码”给商户系统扫描后直接完成支付的模式。主要应用线下面对面收银的场景。
扫码支付扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于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();
}
}
阅读全文
0 0
- 微信、支付宝支付
- 支付宝,微信支付
- 微信支付【支付模式】
- 微信支付Jsapi支付
- 微信支付-刷卡支付
- 微信支付JSAPI支付
- 微信支付 h5 支付
- 支付--微信APP支付
- 微信支付:手机支付
- 支付宝 微信支付
- 支付宝-微信支付
- 微信支付与支付宝支付
- 支付宝支付与微信支付
- 微信支付和支付宝支付
- 微信支付与支付宝支付
- 支付宝支付和微信支付
- 微信支付和支付宝支付
- 支付宝支付接入+微信支付
- 前端面试中的常见的算法问题
- linux查看空间的命令
- 事务专题(三)补充--事务基础
- 小米手机报Installation failed with message Failed to establish session的解决办法
- MySQL笔记——关系模型中的术语
- 微信支付
- Oracle C++ OCCI 编程
- java的几种对象(po,dto,dao等)
- 通过servlet打开本地图片
- # Android LocalSocket and AIDL 传输对象
- 从零开始布置你的个人网站(一)
- JDK8的小常识
- MFC中创建简单定时器
- Nexus 搞机之路 —— aosp源码的获取与编译