2017-08-28 07:14:45 towtotow 阅读数 236
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27858 人正在学习 去看看 秦子恒

当用户在你的微商城下单后,

有时候会因为你公司或者用户的原因,

导致用户想要退款,

这里就需要用到微信的申请退款功能。


61.jpg


这个功能会把订单款项退还到用户支付时的账号中,

需要注意的是超过1年后的订单,

用户就无法申请退款了…

微信开发申请退款视频教程在线观看

http://edu.csdn.net/course/detail/2991/49199

2017-06-02 11:23:26 sinat_35861727 阅读数 15393
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27858 人正在学习 去看看 秦子恒
前面讲了怎么实现微信支付,详见博文:PHP实现微信支付(jsapi支付)流程  和ThinkPHP中实现微信支付(jsapi支付)流程。由于业务需求,还需要有微信退款,经过研究和摸索,也终于搞定了。

前期准备:
当然是搞定了微信支付,不然怎么退款,这次还是使用官方的demo。当然网上可能也有很多大神自己重写和封装了demo,或许更加好用简洁,但是我还是不提倡用,原因如下:
(1)可能功能不全,或许他只是实现了微信支付,但是还有申请退款、查询退款、订单查询、撤销订单等业务功能可能是你后续需要的,如果你依赖于大神的SDK的便捷,如果有新的业务需求,你就懵逼了;
(2)安全考虑,涉及到支付涉及到金钱,必须要非常安全。官方SDK虽然我也吐槽,但至少会相对比较安全,再次重写,虽然暂时没看出问题,但是万一有漏洞就不好了。

本篇还是使用到官方提供的SDK中的最重要的一个类文件WxPay.Api.php中提供的refund()方法来实现,此方法在WxPay.Api.php文件的第141行,代码如下:

/**
 * 
 * 申请退款,WxPayRefund中out_trade_no、transaction_id至少填一个且
 * out_refund_no、total_fee、refund_fee、op_user_id为必填参数
 * appid、mchid、spbill_create_ip、nonce_str不需要填入
 * @param WxPayRefund $inputObj
 * @param int $timeOut
 * @throws WxPayException
 * @return 成功时返回,其他抛异常
 */
public static function refund($inputObj, $timeOut = 6){
	$url = "https://api.mch.weixin.qq.com/secapi/pay/refund";
	//检测必填参数
	if(!$inputObj->IsOut_trade_noSet() && !$inputObj->IsTransaction_idSet()) {
		throw new WxPayException("退款申请接口中,out_trade_no、transaction_id至少填一个!");
	}else if(!$inputObj->IsOut_refund_noSet()){
		throw new WxPayException("退款申请接口中,缺少必填参数out_refund_no!");
	}else if(!$inputObj->IsTotal_feeSet()){
		throw new WxPayException("退款申请接口中,缺少必填参数total_fee!");
	}else if(!$inputObj->IsRefund_feeSet()){
		throw new WxPayException("退款申请接口中,缺少必填参数refund_fee!");
	}else if(!$inputObj->IsOp_user_idSet()){
		throw new WxPayException("退款申请接口中,缺少必填参数op_user_id!");
	}
	$inputObj->SetAppid(WxPayConfig::APPID);//公众账号ID
	$inputObj->SetMch_id(WxPayConfig::MCHID);//商户号
	$inputObj->SetNonce_str(self::getNonceStr());//随机字符串
	
	$inputObj->SetSign();//签名
	$xml = $inputObj->ToXml();
	$startTimeStamp = self::getMillisecond();//请求开始时间
	$response = self::postXmlCurl($xml, $url, true, $timeOut);
	$result = WxPayResults::Init($response);
	self::reportCostTime($url, $startTimeStamp, $result);//上报请求花费时间
	
	return $result;
}
官方的方法,写的很清楚需要哪些参数,还有一些必须参数SDK已经帮我们补齐了,我将这个方法重新封装一下,便于在项目中调用:

/**
 * 微信退款
 * @param  string   $order_id 	订单ID
 * @return 成功时返回(array类型),其他抛异常
 */
function wxRefund($order_id){
	//我的SDK放在项目根目录下的Api目录下
	require_once APP_ROOT."/Api/wxpay/lib/WxPay.Api.php";
	//查询订单,根据订单里边的数据进行退款
	$order = M('order')->where(array('id'=>$order_id,'is_refund'=>2,'order_status'=>1))->find();
	$merchid = WxPayConfig::MCHID;
	
	if(!$order) return false;
	
	$input = new WxPayRefund();
	$input->SetOut_trade_no($order['order_sn']);			//自己的订单号
	$input->SetTransaction_id($order['transaction_id']);  	//微信官方生成的订单流水号,在支付成功中有返回
	$input->SetOut_refund_no(getrand_num(true));			//退款单号
	$input->SetTotal_fee($order['total_price']);			//订单标价金额,单位为分
	$input->SetRefund_fee($order['total_price']);			//退款总金额,订单总金额,单位为分,只能为整数
	$input->SetOp_user_id($merchid);
	
	$result = WxPayApi::refund($input);	//退款操作
	
	// 这句file_put_contents是用来查看服务器返回的退款结果 测试完可以删除了
	//file_put_contents(APP_ROOT.'/Api/wxpay/logs/log3.txt',arrayToXml($result),FILE_APPEND);
	return $result;
}

这里需要吐槽一下,竟然不说返回值的类型,在支付的时候返回的是XML数据,这里竟然返回的是数组,让我措手不及,哈哈不过还是返回数组比较好,可以直接判断处理。

方法调用就更加简单了:

//微信退款
$result = wxRefund($order_id);
// 这句file_put_contents是用来查看服务器返回的退款结果 测试完可以删除了
//file_put_contents(APP_ROOT.'/Api/wxpay/logs/log4.txt',arrayToXml($result),FILE_APPEND);
if(($result['return_code']=='SUCCESS') && ($result['result_code']=='SUCCESS')){
	//退款成功
}else if(($result['return_code']=='FAIL') || ($result['result_code']=='FAIL')){
	//退款失败
	//原因
	$reason = (empty($result['err_code_des'])?$result['return_msg']:$result['err_code_des']);
}else{
	//失败
}
退款成功返回如下:


亲测无误:这是集成了官方的SDK实现的,如果不使用SDK,可以使用更简单的方法,见:PHP实现微信支付(jsapi支付)和退款(无需集成支付SDK)



2018-06-29 23:42:57 dc282614966 阅读数 2997
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27858 人正在学习 去看看 秦子恒

一、前言

   这次的项目主要是关于微信公众号的一个开发,本人这次分配的模块是后台微信公众号的支付和退款,第一次接触微信公众的项目刚开始一脸懵逼,开发过程中遇到各种坑,所以想自己写一篇详细的关于微信公众号的开发,希望能对小伙伴们有所帮助!

二、微信申请退款接口

微信退款接口文档:微信公众号退款申请接口开发文档

退款申请流程:前端调用微信退款申请接口,退款申请需要双向的证书验证,登录微信商户平台(pay.weixin.qq.com)-->账户中心-->账户设置-->API安全-->证书下载。具体安装请参考微信证书安装文档:商户证书安装指导。在微信退款申请接口调用时需要读取服务器安装的证书,然后才能想微信发送请求,否则请求回发送失败或者返回数据为空。如果退款接口中设置了退款结果通知的URL,那么在退款申请成功后会给设置的通知接口返回数据,当放回的结果为SUCCESS时,会携带一部分加密的数据,数据解密方式:

解密步骤如下: 

(1)对加密串A做base64解码,得到加密串B

(2)对商户key做md5,得到32位小写key* ( key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置 )

(3)用key*对加密串B做AES-256-ECB解密(PKCS7Padding)

解密成功后可进行相应的业务处理,代码如下:

申请退款接口:

/**
	 * 
	* @Title: refund  
	* @Description: 微信退款 
	* @param @param request
	* @param @param response
	* @param @return
	* @param @throws Exception     
	* @return Map<String,String>    
	* @throws
	 */
	@ResponseBody
	@RequestMapping("/refund")
	public JsPayResult refund(HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		// 公众账号ID
		String appid = Constants.APPID;
		// 商户号
		String mch_id = Constants.MCHID;
		// 随机字符串
		String nonce_str = CommonUtil.getRandomStr();
		// 商户订单号
		String out_trade_no = request.getParameter("out_trade_no");
		// 商户退款单号,订单号是唯一的,加上订单号防止在高并发下退款单号不唯一
		String out_refund_no = CommonUtil.getOrderIdByTime()+out_trade_no;
		// 订单金额
		String total_fee1 = CommonUtil.getMoney(request.getParameter("total_fee"));
		String total_fee = CommonUtil.getMoney("0.01");
		// 退款金额
		String refund_fee1 = request.getParameter("refund_fee");
		String refund_fee = CommonUtil.getMoney("0.01");
		//退款结果通知url
		String notify_url = Constants.REFOUND_NOTIFY_URL;
		// 将请求参数封装至Map集合中
		SortedMap<String, String> paramMap = new TreeMap<String, String>();
		paramMap.put("appid", appid);
		paramMap.put("mch_id", mch_id);
		paramMap.put("nonce_str", nonce_str);
		paramMap.put("out_trade_no", out_trade_no);
		paramMap.put("out_refund_no", out_refund_no);
		paramMap.put("total_fee", total_fee);
		paramMap.put("refund_fee", refund_fee);
		paramMap.put("notify_url", notify_url);
		logger.info(paramMap);
		// 签名
		String sign = SignUtil.createSign(paramMap, Constants.PARTNER_KEY);
		paramMap.put("sign", sign);
		// 请求的xml数据
		String requestXml = XMLUtil.map2Xml(paramMap, "xml");
		
	//1.指定读取证书格式为PKCS12
        KeyStore keyStore  = KeyStore.getInstance("PKCS12");
        //2.读取本机存放的PKCS12证书文件
        FileInputStream instream = new FileInputStream(new File(Constants.CERTIFICATE_PATH));
        try {
        	 //指定PKCS12的密码(商户ID)
            keyStore.load(instream, Constants.MCHID.toCharArray());
        } finally {
            instream.close();
        }
        //3.ssl双向验证发送http请求报文
        SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, Constants.MCHID.toCharArray()).build();
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,new String[] { "TLSv1" },null,
                SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
        CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
        //4.发送数据到微信的退款接口
        HttpPost httpost= HttpClientConnectionManager.getPostMethod(Constants.REFUND_URL);
        httpost.setEntity(new StringEntity(requestXml, "UTF-8"));
        HttpResponse weixinResponse = httpClient.execute(httpost);
        String resposeXmL = EntityUtils.toString(weixinResponse.getEntity(), "UTF-8");
        
		//5.将返回的xml转换为map
		Map<String, String> responseMap = XMLUtil.xml2Map(resposeXmL);
		JsPayResult result = new JsPayResult();
		if (Constants.RETURN_CODE.equals(responseMap.get("return_code"))) {
			
			result.setAppId(responseMap.get("appid"));
			result.setMchId(responseMap.get("mch_id"));
			result.setNonceStr(responseMap.get("nonce_str"));
			// 微信订单号
			result.setTransactionId(responseMap.get("transaction_id"));
			// 商户订单号
			result.setOutRradeNo(responseMap.get("out_trade_no"));
			// 商户退款单号
			result.setOutRefundNo(responseMap.get("out_refund_no"));
			// 微信退款单号
			result.setRefundId(responseMap.get("refund_id"));
			// 退款金额
			result.setSettlementRefundRee(responseMap.get("settlement_refund_fee"));
			// 订单金额
			result.setTotalFee(responseMap.get("total_fee"));
			//申请退款金额
			result.setRefundFee(responseMap.get("refund_fee"));
			// 现金支付金额
			result.setCashFee(responseMap.get("cash_fee"));
			//退款状态
			result.setRefundStatus(responseMap.get("refund_status"));
			//退款成功时间
			result.setSuccessTime(responseMap.get("success_time"));
			//退款入账账户
			result.setRefundRecvAccout(responseMap.get("refund_recv_accout"));
			//退款资金来源
			result.setRefundAccount(responseMap.get("refund_account"));
            //退款发起来源
			result.setRefundRequestSource(responseMap.get("refund_request_source"));
			result.setResultCode(Constants.RESULT_CODE_SUCCESS);
			result.setMessage("退款成功!");
			logger.info("*******退款申请**********"+"退款成功!");
		}
		else {
			result.setResultCode(Constants.RESULT_CODE_FAIL);
		    result.setMessage("退款失败!");
		    logger.info("*******退款申请**********"+"退款失败!");
			
		}
		return result;
	}

退款接口中涉及到的双向证书验证:

//1.指定读取证书格式为PKCS12
        KeyStore keyStore  = KeyStore.getInstance("PKCS12");
        //2.读取本机存放的PKCS12证书文件
        FileInputStream instream = new FileInputStream(new File(Constants.CERTIFICATE_PATH));//读取证书的安装路径
        try {
        	 //指定PKCS12的密码(商户ID)
            keyStore.load(instream, Constants.MCHID.toCharArray());
        } finally {
            instream.close();
        }
        //3.ssl双向验证发送http请求报文
        SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, Constants.MCHID.toCharArray()).build();
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,new String[] { "TLSv1" },null,
                SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
        CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
        //4.发送数据到微信的退款接口
        HttpPost httpost= HttpClientConnectionManager.getPostMethod(Constants.REFUND_URL);
        httpost.setEntity(new StringEntity(requestXml, "UTF-8"));
        HttpResponse weixinResponse = httpClient.execute(httpost);
        String resposeXmL = EntityUtils.toString(weixinResponse.getEntity(), "UTF-8");

三、退款结果通知接口

/**
	 * 
	* @Title: refundNotify  
	* @Description: 退款结果通知  
	* @param @param request
	* @param @param response
	* @param @return
	* @param @throws Exception     
	* @return Map<String,String>    
	* @throws
	 */
	@ResponseBody
	@RequestMapping("/refundNotify")
	public JsPayResult refundNotify(HttpServletRequest request, HttpServletResponse response) throws Exception {
		// 将request请求中的数据转换为字符串
		String reqpXml = CommonUtil.readRequestStr(request);
		// 将返回串转换成 Map
		Map<String, String> xmlToMap = XMLUtil.xml2Map(reqpXml);
		// 返回给微信的结果
		String respXml = "";
		JsPayResult result = new JsPayResult();
		// 在return_code为SUCCESS的时候有返回 req_info
		if (Constants.RETURN_CODE.equals(xmlToMap.get("return_code"))) {
			// 退款返回加密信息
			String reqInfo = xmlToMap.get("req_info");
			// 解密后的信息
			String decodeReqInfo = AESUtil.decryptData(reqInfo);
			// 将解密后的信息换成 Map
			Map<String, String> reqInfoMap = XMLUtil.xml2Map(decodeReqInfo);

			ResponseResult responseResult = refundRegistration(Constants.BRANCHCODE, reqInfoMap.get("out_trade_no"),
					reqInfoMap.get("transaction_id"), "3300", DateUtil.getTradeTime(reqInfoMap.get("success_time")),
					Constants.YYSOURCE);
			if (Constants.RESULTCODE.equals(responseResult.getResultCode())) {
				respXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"
						+ "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";
				result.setMessage("退款成功!");
			} else {
				respXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"
						+ "<return_msg><![CDATA[ERROR]]></return_msg>" + "</xml> ";
				result.setMessage("退款失败!");
			}
			
			logger.info("*******退款通知**********" + "退款成功!");
		} else {
			respXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg><![CDATA["
					+ xmlToMap.get("return_code") + "]]></return_msg>" + "</xml> ";
			result.setMessage("退款失败!");
			logger.info("*******退款通知**********" + "退款失败!");
		}

		result.setResultCode(xmlToMap.get("return_code"));
		BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
		out.write(respXml.getBytes());
		out.flush();
		out.close();
		return result;
	}

解密方式:

public class AESUtil {

	/**
	 * 密钥算法
	 */
	private static final String ALGORITHM = "AES";
	/**
	 * 加解密算法/工作模式/填充方式
	 */
	private static final String ALGORITHM_MODE_PADDING = "AES/ECB/PKCS7Padding";
	/**
	 * 生成key(商户密钥)
	 */
	private static final String key = "qp2tMA7jIDLyRRhz83Ut2eVQh8qaI5PD";

	/**
	 * 对商户key做md5
	 */
	private static SecretKeySpec secretKey = new SecretKeySpec(MD5Util.MD5Encode(key, "UTF-8").toLowerCase().getBytes(),
			ALGORITHM);

	/**
	 * AES加密
	 * 
	 * @param data
	 * @return
	 * @throws Exception
	 */
	public static String encryptData(String data) throws Exception {
		Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
		// 创建密码器
		Cipher cipher = Cipher.getInstance(ALGORITHM_MODE_PADDING);
		// 初始化
		cipher.init(Cipher.ENCRYPT_MODE, secretKey);
		return Base64Util.encode(cipher.doFinal(data.getBytes()));
	}

	/**
	 * AES解密
	 * 
	 * @param base64Data
	 * @return
	 * @throws Exception
	 */
	public static String decryptData(String base64Data) throws Exception {
		Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
		// 创建密码器
		Cipher cipher = Cipher.getInstance(ALGORITHM_MODE_PADDING);
		// 初始化
		cipher.init(Cipher.DECRYPT_MODE, secretKey);
		return new String(cipher.doFinal(Base64Util.decode(base64Data)));
	}

	public static void main(String[] args) throws Exception {
		// String A 为测试字符串,是微信返回过来的退款通知字符串
		String A = "N0lJ0LWjHQlVOTEYdlRoVDbqWq+tRo9ZzvcwvIGHjFN6pYmHEX44W9l/jlyw8cwHueWk3m4hpldha73MgmCZJUu5LBZv27y/Vx2RkvHKCkiI5mV9pqQxiJmZTB1PN6s2wT3EVN1BFciGNzhozqQNIOyn/B9VOVKXkTeh1to8nI/UFVDexDE4ZyMBoB9oCQVcnkAuPaWqibHMU7i0iapB1UEMYJCgRKza9OGtvs0WbqIRgVVhtFxpxMhHmIaxzvH0JrdD/iOAYEV/NxUkye2HNJahatcYFBFQlbrTTBJ67MXZ6NzwFaOqqQYxZAKKEDrU++zu7hhX0lC5rZ5Uoyavn/sYTK3ZoCgAg/6O+S/f9sg+FoD8BrZmxC6tZwTfkDGsEO09m/JSTDxgU9ToCypyQt+bCxIFhLkGt8wKAtIEo0VOrfT9yMvHyBNLHtvNXj9gTQP+bMtpWAr0iMNgLwyXC2KY2FVxLmBEAnIIcXw7W15QItPcNVpQZceZooZwXn3QT6D4QDoHyg7ymHiAbtax0xHeYVGuGDB95E22q5C1Hh1a+7nyqkkJm1tzgJwyU+hhCw3Kw0Sj4JJVoLn6hFIBmVrDHf9x7j6VBULZ+39zk2upEudu/2TU1QVx96RCMW2O8EKXthPjzoOzZh1KeBsdkodrSn6gpBRNhIdbeimyAANVTyN+eeHThdx4tgEhodr9nVawFCSnD7jajowwaABFv/5AeWXSohfbbxAVrghNCjsfR4Grybr9fb6wB7hJ2yPZIKgdf8nGa9B7joKfZl2N7xIRawhGAVR3RRC2ajBEiabqaNhBCvhHPzR75oXViUL5OzVSyYznvrE1JEIgtGSN0rI/hUBIxhnTEv/X9C3NWiYRWoLMt29vJbQlk9hgQHVnTpH00khjXe8tdtMIkY7FUJmIsZH8D0jDMAvDj00Zl6r5z7FsyzRR+0xNsiyj8BPAxmSLqyrvXtgYx91N8I16TsgEBPJACL7tHkUr+kjQNXNzRp32mJFkB7/ZNQaXH8cm5aUAFk9eCuQAD4GqQxoYHOs/L7q2WMdajxPPxQSO6JU=";
		String B = AESUtil.decryptData(A);
		System.out.println(B);
	}

}


2017-05-16 16:40:28 anmin1234 阅读数 143
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27858 人正在学习 去看看 秦子恒

1、生成一个菜单:

	public static String getMenu(){
		Menu menu = new Menu();
		ViewButton viewButton = new ViewButton();
		viewButton.setName("搜索");
		viewButton.setType("view");
		viewButton.setUrl("http://www.soso.com/");
		menu.setButton(new ViewButton[]{viewButton});
		Gson gson = new Gson();
		String json = gson.toJson(menu);
		System.out.println(json);
		String token = GetAccessToken.getAccessToken("APPID","APPSECRET");
		String url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
		url = url.replaceAll("ACCESS_TOKEN", token);
		String respStr = null;
		try {
			respStr = HttpsRequestUtil.httpRequest(url, "POST", json);
			System.out.println(respStr);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public static void main(String[] args) {
		getMenu();
	}

注意:需将APPID、APPSECRET替换成你的微信公众账号的APPID和APPSECRET。


2、生成3个菜单:

import com.google.gson.Gson;
import com.wechat.joyful.entity.AccessToken;
import com.wechat.joyful.tools.GetAccessToken;
import com.wechat.joyful.tools.HttpsRequestUtil;

public class GetMenu {
	
	public static String getMenu(){
		Menu menu = new Menu();
		ViewButton viewButton = new ViewButton();
		viewButton.setName("搜索");
		viewButton.setType("view");
		viewButton.setUrl("http://www.soso.com/");
		ViewButton viewButton2 = new ViewButton();
		viewButton2.setName("搜索");
		viewButton2.setType("view");
		viewButton2.setUrl("http://www.soso.com/");
		ViewButton viewButton3 = new ViewButton();
		viewButton3.setName("搜索");
		viewButton3.setType("view");
		viewButton3.setUrl("http://www.soso.com/");
		menu.setButton(new ViewButton[]{viewButton,viewButton2,viewButton3});
		Gson gson = new Gson();
		String json = gson.toJson(menu);
		System.out.println(json);
		String token = GetAccessToken.getAccessToken("APPID","APPSECRET");
		String url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
		url = url.replaceAll("ACCESS_TOKEN", token);
		String respStr = null;
		try {
			respStr = HttpsRequestUtil.httpRequest(url, "POST", json);
			System.out.println(respStr);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public static void main(String[] args) {
		getMenu();
	}



3、加入子菜单

public static String getMenu(){
		
		Menu menu = new Menu();
		ViewButton viewButton = new ViewButton();
		viewButton.setName("搜索");
		viewButton.setType("view");
		viewButton.setUrl("http://www.soso.com/");
		ViewButton viewButton2 = new ViewButton();
		viewButton2.setName("搜索");
		viewButton2.setType("view");
		viewButton2.setUrl("http://www.soso.com/");
		ViewButton viewButton3 = new ViewButton();
		viewButton3.setName("搜索");
		viewButton3.setType("view");
		viewButton3.setUrl("http://www.soso.com/");
		
		SubButton sbtn = new SubButton();
		sbtn.setName("哈哈哈");
		sbtn.setSub_button(new ViewButton[]{viewButton,viewButton2,viewButton3});
		
		menu.setButton(new Button[]{viewButton,viewButton2,sbtn});
		Gson gson = new Gson();
		String json = gson.toJson(menu);
		System.out.println(json);
		String token = GetAccessToken.getAccessToken("APPID","APPSECRET");
		String url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
		url = url.replaceAll("ACCESS_TOKEN", token);
		String respStr = null;
		try {
			respStr = HttpsRequestUtil.httpRequest(url, "POST", json);
			System.out.println(respStr);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public static void main(String[] args) {
		getMenu();
	}


实体类

Menu类
public class Menu {
	private Button[] button;
	public Button[] getButton() {
		return button;
	}
	public void setButton(Button[] button) {
		this.button = button;
	}
}


Button类
public class Button {
	private String name;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}


SubButton类
public class SubButton extends Button {
	private Button[] sub_button;
	public Button[] getSub_button() {
		return sub_button;
	}
	public void setSub_button(Button[] subButton) {
		sub_button = subButton;
	}
}


ViewButton类
public class ViewButton extends Button {
	private String type;
	private String url;
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}
}







2015-07-18 19:30:38 wyx100 阅读数 3298
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27858 人正在学习 去看看 秦子恒
  1. 微信公众服务号申请
      百度图文教程
  1. 微信服务号认证(开通支付)

       百度图文教程

 
       比百度更详细的教程

 

微信名生成器

阅读数 644

微信开发

阅读数 913

没有更多推荐了,返回首页