微信开发-公众号支付(2)-统一下单

上篇文章介绍了如何获取openid。

先放一张官方的时序图。
这里写图片描述

红色部分是需要我们来做的。
1.生成链接或者二维码,实际开发时,根据需求不同具体流程会有小小的变化,这一步无非就是生成链接,也可以在这一步获取到用户的openid等等操作。

4.生成商户订单。这里需要根据实际订单设计订单表,无非是ID,商户订单编号(唯一),创建时间,状态,等等。

5.调用统一下单api. 很关键的一步,获取prepay_id。

6.生成jsapi界面。在我看来是最难的一步,开发过程中踩了不少的坑。

10.告知微信通知处理结果。很关键,如果你不想赔钱。

这篇文章介绍公众号支付流程的第四步,调用统一下单接口。

(推荐去微信支付开发文档里下载sdk和调用示例,里面有现成的工具类可以使用)
这里写图片描述

这里下载java的这里写图片描述 这玩意儿里面有XML Map互相转化,生成带有sign的xml,签名校验,生成随机字符串,生成md5,生成HMACSHA256等功能,还是很好用的,毕竟官方的,也不用担心出什么错。

统一下单api,官方文档中有很明确的说明了,这里需要说明的是,变量名必须与文档中的一致。
有几个关键且必须的参数
1. appid 不解释
2. mch_id 商户号 必须与 公众号对应
3 .nonce_str 随机字符串 用官方sdk中的工具类生成 WXPayUtil.generateNonceStr()
4. body 商品描述
5. out_trade_no 商户订单号 商户后台系统订单的唯一编号
6. spbill_create_ip 用户终端ip 用户首先访问的是商户后台,所以获取到ip就非常容易,方法不再赘述
7. notify_url 通知地址,这个很关键,关系到你的商户后台订单管理系统能否正确的处理订单的状态,比如用户通过微信付款了,你这边却没有更改状态;
8. trade_type 交易类型,公众号支付,JSAPI
9. total_fee 订单金额,单位分
10. openid 当交易类型为JSAPI时,此参数必传, 如何获取用户openid,上篇文章中已经有介绍
11. sign 签名,签名算法微信官方给出了介绍,但是只看介绍就是扯淡,官方给的sdk中有工具类,所以,我们直接用就好了。

如何生成签名sign,把参数放入map,用官方工具类生成
Map<String,String> paraMap = new HashMap<String,String>();  
//公众账号ID
paraMap.put("appid","");
//商户号
paraMap.put("mch_id","");  
//随机字符串
paraMap.put("nonce_str", WXPayUtil.generateNonceStr());  
//商品描述
paraMap.put("body","");  
//商户系统内部订单号
paraMap.put("out_trade_no","");  
//标价金额 单位分
paraMap.put("total_fee","");  
//用户终端IP
paraMap.put("spbill_create_ip","");  
//通知地址
paraMap.put("notify_url","http://xxxx.com/demo/notify"/**/);  
//交易类型0
paraMap.put("trade_type","JSAPI");  
//openid
paraMap.put("openid", "");
//MD5签名
String xmlData = WXPayUtil.generateSignedXml(paraMap, /*payKey,支付key,上篇文章中介绍的从商户平台中获取的32位key*/);
//xmlData即为包括所有参数和sign的xml

这里要注意,使用httpclient调用接口时,参数不能使用Entity来发送,一定要将xml转为流。

String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";  
HttpClient client = new DefaultHttpClient();
InputStreamEntity ise = new InputStreamEntity(new ByteArrayInputStream(xmlData.getBytes("utf-8")));
httpPost.setEntity(ise);
HttpResponse resp = client.execute(httpPost);
//微信服务器返回的xml字符串
String result = EntityUtils.toString(resp.getEntity(),"utf-8");
Map<String, String> paramResult = new HashMap<String, String>();
//转换为map
paramResult  = WXPayUtil.xmlToMap(result);

如果请求成功,则微信会返回xml格式的结果。

如果result_code 和 return_code 都为 true ,则返回的数据中会含有prepay_id ,很关键的值,下一篇生成jsapi界面时将会使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值