微信扫码支付
一,微信支付接入流程图:二,微信支付类型刷卡支付公众号支付//提交资料到 微信公众平台扫码支付//提交资料到 微信公众平台APP支付//提交资料到 微信开放者平台H5支付小程序支付三,扫码支付介绍1,扫码支付涉及API统一下单支付结果通知微信支付安全机制2,扫码支付开发步骤A,下载微信支付demo...
·
一,微信支付接入流程图:
二,微信支付类型
- 刷卡支付
- 公众号支付 //提交资料到 微信公众平台
- 扫码支付 //提交资料到 微信公众平台
- APP支付 //提交资料到 微信开放者平台
- H5支付
- 小程序支付
三,扫码支付介绍
1,扫码支付涉及API
统一下单
支付结果通知
微信支付安全机制
2,扫码支付开发步骤
A,下载微信支付demo
微信扫码支付官网下载--SDK与DE
B,提取微信支付工具类
C,编写微信支付调用接口
D,生成微信支付二维码
E,编写微信异步通知接口
F,检测微信支付结果
//创建支付项目
//提供者项目,主要是 商品库存修改 和 订单状态修改 的业务功能,这里省略
····················································································
//消费者项目
//消费者业务层 主要是 商品库存修改 和 订单状态修改 以及 获得订单信息 的业务功能,这里省略
package cn.bdqn.Service;
·················································································
//消费者controller层
package cn.bdqn.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import cn.bdqn.common.Dto;
/**
*微信扫码支付
*/
@Controller
@RequestMapping(value = "/api/wx")
public class WxPaymentController{
@Resource
private QgWxpayService wxpayService; //业务类
/**
*调用统一下单API
*@param orderNo 订单编号
*@return
*/
@RequestMapping(value = "/createqccode/{orderNo}",method=RequestMethod.GET)
@ResponseBody
public Dto createQccode(@PathVariable String orderNo){
//通过订单编号获取订单信息
QgOrder order = wxpayService.loadQgOrderByOrderNo(orderNo);
Map<String,String> data = new HashMap<String,String>();
//1,获取请求所需的参数
data.put("body","腾讯充值中心--QQ会员充值"); //商品描述
data.put("out_trade_no",orderNo); //商户订单号
data.put("device_info",""); //设备号,不是必填
data.put("fee_type","CNY"); //标价币种
data.put("total_fee","1"); //订单金额,单位是分,只能是整数不能小数
data.put("spbill_create_ip","123.12.12.123"); //终端IP,商户提供的自己的IP
data.put("notify_url","http://穿透地址/api/wx/notify"); //返回通知地址
data.put("trade_type","NATIVE"); //交易类型,NATIVE:扫码支付
data.put("product_id","12"); //商品ID,不是必填
//sign值在下载demo里WXPayUtil.java类generateNonceStr()方法获得,拷贝类调用方法
data.put("nonce_str",WXPayUtil.generateNonceStr()); //随机字符串,保证安全用
//appid值和mch_id值是在下载的微信支付demo里WXPayConfigImpl.java里
data.put("appid","wxab8acb865bb1637e"); //公众账号ID
data.put("mch_id","11473623"); //商户号 公众账号ID和商户号通过平台注册账号获得
try{
//sign值在下载demo里WXPayUtil.java类generateSignedXml()方法获得,拷贝类调用方法
//key值在下载的微信支付demo里WXPayConfigImpl.java里
//generateSignedXml()方法第三个参数是签名类型,可以不给,默认MD5
String reqxml = WXPayUtil.generateSignedXml(data,key值); //获得签名
//2,带上参数去请求微信的URL:https://api.mch.weixin.qq.com/pay/unifiedorder
//下载demo里WXPayRequest.java类里requestOnce()方法,拷贝类,删除多于方法
//修改此方法,见最下面
WXPayRequest wxPayRequest = new WXPayRequest();
String wxUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder";
String respxml = wxPayRequest.requestOnce(wxUrl,reqxml);
Map<String,String> respMap = new HashMap<String,String>();
//转为MAP
respMap = WXPayUtil.xmlToMap(respxml);
//3,拿到请求的返回结果code_url,然后可以生成二维码让用户扫码支付
String codeUrl;
if("SUCCESS".equals(respMap.get("result_code"))){
codeUrl = respMap.get("code_url");
return DtoUtil.returnSuccess("获取预支付连接成功",codeUrl);
}
}catch(Exception e){
e.printStackTrace();
}
return DtoUtil.returnFail("获取预支付连接失败","fail");
}
/**
*返回通知结果
*@return
*/
@RequestMapping(value = "/notity",method = RequestMethod.POST)
@ResponseBody
public String paymentCallback(HttpServletResponse response,
HttpServletRequest request){
//接收微信支付系统返回的数据
Map<String,String> reqMap = new HashMap<String,String>();
Map<String,String> resultMap = new HashMap<String,String>();
String returnxml = "";
try{
InputStream inputStream = request.getInputStream();
BufferedReader in =
new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
StringBuilder sb = new StringBuilder();
String s;
while((s = in.readLine()) != null){
sb.append(s);
}
in.close();
inputStream.close();
reqMap = WXPayUtil.xmlToMap(sb.toString);
//验证数据中签名的正确性
//key值在下载的微信支付demo里WXPayConfigImpl.java里
boolean flag = WXPayUtil.isSignatureValid(reqMap,key值,签名类型(可以省略));
if(flag){
//如果签名正确,商户进行自身业务的实现
String returnCode = reqMap.get("return_code");
if("SUCCESS".equals(returnCode)){ //支付成功
//获取微信支付订单号,存入数据库
String wxOrderNo = reqMap.get("transaction_id");
//获取商户订单号
String orderNo = reqMap.get("out_trade_no");
//通过商户订单号对订单状态判断,做相应的业务操作
//如果订单状态是已支付,不做操作
//如果订单是未支付,修改库存,修改订单状态
System.out.println("订单状态修改完成");
}else{ //支付失败
resultMap.put("return_code","FAIL");
resultMap.put("return_msg","支付失败");
}
}else{
//签名验证失败,则返回相应失败信息
resultMap.put("return_code","FAIL");
resultMap.put("return_msg","签名失败");
}
returnxml = WXPayUtil.mapToXml(resultMap);
}catch(IOException e){
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
return returnxml;
}
}
//请求,只请求一次,不做重试(修改后)
public String requestOnce(String url,String reqxml)throws Exception{
//不需要证书判断
BasicHttpClientConnectionManager connManager;
connManager = new BasicHttpClientConnectionManager(
RegistryBuilder.<`>create()
.register("http",PlainConnectionSocketFactory.getSocketFactory())
.register("https",PlainConnectionSocketFactory.getSocketFactory())
.build(),
connFactory:null,
schemePortResolver:null,
dnsResolver:null
);
HttpClient httpClient = HttpClientBuilder.create()
.setConnectionManager(connManager)
.build();
HttpPost httpPost = new HttpPost(url);
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(1000)
.setConnectTimeout(1000).build();
httpPost.setConfig(requestConfig);
StringEmtity postEntity = new StringEntity(reqxml,"UTF-8");
httpPost.addHeader("Content-type","text/xml");
httpPost.addHeader(postEntity);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
return EntityUtils.toString(httpEntity,"UTF-8");
}
更多推荐
已为社区贡献1条内容
所有评论(0)