网站如何实现下家风云社区自助下单单订货

微信公众号支付(二)实现统一下单接口
字体:[ ] 类型:转载 时间:
本篇文章主要给大家介绍调用微信公众支付的统一下单API,通过参数封装为xml格式并发送到微信给的接口地址就可以获得返回内容,需要的朋友可以参考下本文
已经获取到了用户的OpenId
这篇主要是调用微信公众支付的统一下单API
看文档,主要流程就是把20个左右的参数封装为XML格式发送到微信给的接口地址,然后就可以获取到返回的内容了,如果成功里面就有支付所需要的预支付ID
请求参数就不解释了。
其中,随机字符串:我用的是UUID去中划线
public static String create_nonce_str() {
return UUID.randomUUID().toString().replace("-","");
商户订单号:每个订单号只能使用一次,所以用的是系统的订单号加的时间戳。
总金额:不能为
通知地址:微信支付成功或失败回调给系统的地址
import java.io.S
public class PayInfo implements Serializable{
private static final long serialVersionUID = L;
private String mch_
private String device_
private String nonce_
private String out_trade_
private int total_
private String spbill_create_
private String notify_
private String trade_
//下面是get,set方法
* 创建统一下单的xml的java对象
* @param bizOrder 系统中的业务单号
* @param ip 用户的ip地址
* @param openId 用户的openId
public PayInfo createPayInfo(BizOrder bizOrder,String ip,String openId) {
PayInfo payInfo = new PayInfo();
payInfo.setAppid(Constants.appid);
payInfo.setDevice_info("WEB");
payInfo.setMch_id(Constants.mch_id);
payInfo.setNonce_str(CommonUtil.create_nonce_str().replace("-", ""));
payInfo.setBody("这里是某某白米饭的body");
payInfo.setAttach(bizOrder.getId());
payInfo.setOut_trade_no(bizOrder.getOrderCode().concat("A").concat(DateFormatUtils.format(new Date(), "MMddHHmmss")));
payInfo.setTotal_fee((int)bizOrder.getFeeAmount());
payInfo.setSpbill_create_ip(ip);
payInfo.setNotify_url(Constants.notify_url);
payInfo.setTrade_type("JSAPI");
payInfo.setOpenid(openId);
return payI
获取签名:
* 获取签名
* @param payInfo
* @throws Exception
public String getSign(PayInfo payInfo) throws Exception {
String signTemp = "appid="+payInfo.getAppid()
+"&attach="+payInfo.getAttach()
+"&body="+payInfo.getBody()
+"&device_info="+payInfo.getDevice_info()
+"&mch_id="+payInfo.getMch_id()
+"&nonce_str="+payInfo.getNonce_str()
+"&notify_url="+payInfo.getNotify_url()
+"&openid="+payInfo.getOpenid()
+"&out_trade_no="+payInfo.getOut_trade_no()
+"&spbill_create_ip="+payInfo.getSpbill_create_ip()
+"&total_fee="+payInfo.getTotal_fee()
+"&trade_type="+payInfo.getTrade_type()
+"&key="+Constants. //这个key注意
MessageDigest md = MessageDigest.getInstance("MD");
md.reset();
md.update(signTemp.getBytes("UTF-"));
String sign = CommonUtil.byteToStr(md.digest()).toUpperCase();
注意:上面的Constants.key取值在商户号API安全的API密钥中。
一些工具方法:获取ip地址,将字节数组转换为十六进制字符串,将字节转换为十六进制字符串
* 将字节数组转换为十六进制字符串
* @param byteArray
public static String byteToStr(byte[] byteArray) {
String strDigest = "";
for (int i = ; i & byteArray. i++) {
strDigest += byteToHexStr(byteArray[i]);
return strD
* 将字节转换为十六进制字符串
* @param btyes
public static String byteToHexStr(byte bytes) {
char[] Digit = { '', '', '', '', '', '', '', '', '', '', 'A', 'B', 'C', 'D', 'E', 'F' };
char[] tempArr = new char[];
tempArr[] = Digit[(bytes &&& ) & XF];
tempArr[] = Digit[bytes & XF];
String s = new String(tempArr);
* 获取ip地址
* @param request
public static String getIpAddr(HttpServletRequest request) {
InetAddress addr =
addr = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
return request.getRemoteAddr();
byte[] ipAddr = addr.getAddress();
String ipAddrStr = "";
for (int i = ; i & ipAddr. i++) {
if (i & ) {
ipAddrStr += ".";
ipAddrStr += ipAddr[i] & xFF;
return ipAddrS
这样就获取了签名,把签名与PayInfo中的其他数据转成XML格式,当做参数传递给统一下单地址。
PayInfo pi = pu.createPayInfo(bo,"...","");
String sign = pu.getSign(pi);
pi.setSign(sign);
* 扩展xstream使其支持CDATA
private static XStream xstream = new XStream(new XppDriver() {
public HierarchicalStreamWriter createWriter(Writer out) {
return new PrettyPrintWriter(out) {
//增加CDATA标记
boolean cdata =
@SuppressWarnings("rawtypes")
public void startNode(String name, Class clazz) {
super.startNode(name, clazz);
protected void writeText(QuickWriter writer, String text) {
if (cdata) {
writer.write("&![CDATA[");
writer.write(text);
writer.write("]]&");
writer.write(text);
public static String payInfoToXML(PayInfo pi) {
xstream.alias("xml", pi.getClass());
return xstream.toXML(pi);
@SuppressWarnings("unchecked")
public static Map&String, String& parseXml(String xml) throws Exception {
Map&String, String& map = new HashMap&String, String&();
Document document = DocumentHelper.parseText(xml);
Element root = document.getRootElement();
List&Element& elementList = root.elements();
for (Element e : elementList)
map.put(e.getName(), e.getText());
下面就是调用统一下单的URL了
(MessageUtil.payInfoToXML(pi).replace("__", "_"));
  Map&String, String& map = CommonUtil.httpsRequestToXML("https://api.mch./pay/unifiedorder", "POST", MessageUtil.payInfoToXML(pi).replace("__", "_").replace("&![CDATA[", "").replace("]]&", ""));
public static Map&String, String& httpsRequestToXML(String requestUrl, String requestMethod, String outputStr) {
Map&String, String& result = new HashMap&&();
StringBuffer buffer = httpsRequest(requestUrl, requestMethod, outputStr);
result = MessageUtil.parseXml(buffer.toString());
} catch (ConnectException ce) {
log.error("连接超时:"+ce.getMessage());
} catch (Exception e) {
log.error("https请求异常:"+ece.getMessage());
httpsRequest()这个方法在第一篇中
上面获取到的Map如果成功的话,里面就会有
String return_code = map.get("return_code");
if(StringUtils.isNotBlank(return_code) && return_code.equals("SUCCESS")){
  String return_msg = map.get("return_msg");
if(StringUtils.isNotBlank(return_msg) && !return_msg.equals("OK")) {
  return "统一下单错误!";
  return "统一下单错误!";
String prepay_Id = map.get("prepay_id");
这个prepay_id就是预支付的ID。后面支付需要它。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具淘宝下单如何实现自助购买和续期?
淘宝下单如何实现自助购买和续期?
在本公司淘宝官方网店下单之后,即可使用本平台实现自动购买和续期。
淘宝官方网店地址: (其它网店下单与本公司无关)淘宝下单并支付后自动购买和续期流程:1 登录本站,登录后进入会员中心2 在会员中心主菜单中点击 [淘宝订单自助入帐] 链接3 在进入的页面,输入您的淘宝帐号和已付款订单号,然后提交。& 如果输入正确,那么系统会将订单付款金额自动录入帐户余额中。请注意,需要在订单付款后两分钟左右才能执行此操作。一旦订单付款金额录入帐户余额,用户即可使用余额进行购买或续期。入帐后淘宝订单状态会变成“已发货”状态。4 上面步骤操作成功后,用户帐户会录入对应金额的余额,可自助用余额来购买订单或续期订单。
Copyright (C) 2013 成都启航数据科技有限公司版权所有
网站备案号:蜀ICP备号-1

我要回帖

更多关于 自助下单系统 的文章

 

随机推荐