微信签到一天10元认证怎么还有退款

404错误,页面没找到 Page Not Found
同学,你访问的页面不存在,你迷路了吗?
秒后自动跳转回首页,你还可以:
1. 立刻 ;
2. 你是不是想去:function pay($openid='', $username='', $desc='', $money=0){
$apiUrl = $this->APPURL;//企业付款接口url
$Parameters=array();
$Parameters['amount']
= $//企业付款金额,单位为分
$Parameters['check_name']
= 'NO_CHECK';//NO_CHECK:不校验真实姓名 FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账) OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功)
$Parameters['desc']
= $//企业付款操作说明信息。必填。
$Parameters['mch_appid']
= $this->APPID;//微信分配的公众账号ID
$Parameters['mchid']
= $this->MCHID;//微信支付分配的商户号
$Parameters['nonce_str']
= $this->createNoncestr();//随机字符串,不长于32位
$Parameters['openid']
= $//商户appid下,某用户的openid
$Parameters['partner_trade_no'] = 'saso'.time().rand(1);//商户订单号,需保持唯一性
$Parameters['re_user_name']
= $//收款用户真实姓名。 如果check_name设置为FORCE_CHECK或OPTION_CHECK,则必填用户真实姓名
$Parameters['spbill_create_ip'] = $_SERVER['SERVER_ADDR'];//调用接口的机器Ip地址
$Parameters['sign']
= $this->getSign($Parameters);//签名
= $this->arrayToXml($Parameters);
= $this->postXmlSSLCurl($xml,$apiUrl);
$return = $this->xmlToArray($res);
var_dump($return);
//return $
格式化参数,在签名过程中需要使用到
function formatBizQueryParaMap($paraMap, $urlencode)
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k => $v)
if($urlencode)
$v = urlencode($v);
//$buff .= strtolower($k) . "=" . $v . "&";
$buff .= $k . "=" . $v . "&";
if (strlen($buff) > 0)
$reqPar = substr($buff, 0, strlen($buff)-1);
return $reqP
此处代码很简单~不做过多注释。就一个排序、循环和字符串长度判断。
生成签名---这里很重要~撸主也弄了好一会~请大家务必认真看注释
function getSign($Obj)
foreach ($Obj as $k => $v)
$Parameters[$k] = $v;
//签名步骤一:按字典序排序参数
ksort($Parameters);
$String = $this->formatBizQueryParaMap($Parameters, false);
//echo '【string1】'.$String.'';
//签名步骤二:在string后加入KEY
$String = $String."&key=4321abcdxingaaabb235";//此处请填写商户平台中的 API密钥
//echo "【string2】".$String."";
//签名步骤三:MD5加密
$String = md5($String);
//echo "【string3】 ".$String."";
//签名步骤四:所有字符转为大写
$result_ = strtoupper($String);
//echo "【result】 ".$result_."";
return $result_;
排序的规则,没理解的请看这:
◆ 参数名ASCII码从小到大排序(字典序);
◆ 如果参数的值为空不参与签名;
◆ 参数名区分大小写;
◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
假设传送的参数如下:
wxd930ea5d5a258f4f
device_info:
nonce_str:
ibuaiVcKdpRxkhJA
第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:
stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=&nonce_str=ibuaiVcKdpRxkhJA";
第二步:拼接API密钥:
stringSignTemp="stringA&key=c09247ec02edce69f6a2d"
sign=MD5(stringSignTemp).toUpperCase()="9A0AA9CF3B7"
最终得到最终发送的数据:
wxd930ea5d5a258f4f
ibuaiVcKdpRxkhJA
9A0AA9CF3B7
**以上示例摘抄自微信支付官方文档**
产生随机字符串,长度不超过32位
function createNoncestr( $length = 32 )
$chars = "abcdefghijklmnopqrstuvwxyz";
//这里不用修改,照抄即可
for ( $i = 0; $i < $ $i++ )
$str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
太过简单,不做叙述!
function arrayToXml($arr)
$xml = "";
foreach ($arr as $key=>$val)
if (is_numeric($val))
$xml.="&".$key.">".$val."";
$xml.="&".$key.">
function pay($openid='', $username='', $desc='', $money=0){
$apiUrl = $this->APPURL;//企业付款接口url
$Parameters=array();
$Parameters['amount']
= $//企业付款金额,单位为分
$Parameters['check_name']
= 'NO_CHECK';//NO_CHECK:不校验真实姓名 FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账) OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功)
$Parameters['desc']
= $//企业付款操作说明信息。必填。
$Parameters['mch_appid']
= $this->APPID;//微信分配的公众账号ID
$Parameters['mchid']
= $this->MCHID;//微信支付分配的商户号
$Parameters['nonce_str']
= $this->createNoncestr();//随机字符串,不长于32位
$Parameters['openid']
= $//商户appid下,某用户的openid
$Parameters['partner_trade_no'] = 'saso'.time().rand(1);//商户订单号,需保持唯一性
$Parameters['re_user_name']
= $//收款用户真实姓名。 如果check_name设置为FORCE_CHECK或OPTION_CHECK,则必填用户真实姓名
$Parameters['spbill_create_ip'] = $_SERVER['SERVER_ADDR'];//调用接口的机器Ip地址
$Parameters['sign']
= $this->getSign($Parameters);//签名
= $this->arrayToXml($Parameters);
= $this->postXmlSSLCurl($xml,$apiUrl);
$return = $this->xmlToArray($res);
var_dump($return);
//return $
作用:格式化参数,签名过程需要使用
function formatBizQueryParaMap($paraMap, $urlencode)
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k => $v)
if($urlencode)
$v = urlencode($v);
//$buff .= strtolower($k) . "=" . $v . "&";
$buff .= $k . "=" . $v . "&";
if (strlen($buff) > 0)
$reqPar = substr($buff, 0, strlen($buff)-1);
return $reqP
作用:生成签名
function getSign($Obj)
foreach ($Obj as $k => $v)
$Parameters[$k] = $v;
//签名步骤一:按字典序排序参数
ksort($Parameters);
$String = $this->formatBizQueryParaMap($Parameters, false);
//echo '【string1】'.$String.'';
//签名步骤二:在string后加入KEY
$String = $String."&key=guoyaojituanfengliaoxing";
//echo "【string2】".$String."";
//签名步骤三:MD5加密
$String = md5($String);
//echo "【string3】 ".$String."";
//签名步骤四:所有字符转为大写
$result_ = strtoupper($String);
//echo "【result】 ".$result_."";
return $result_;
作用:产生随机字符串,不长于32位
function createNoncestr( $length = 32 )
$chars = "abcdefghijklmnopqrstuvwxyz";
for ( $i = 0; $i < $ $i++ )
$str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
作用:array转xml
function arrayToXml($arr)
$xml = "";
foreach ($arr as $key=>$val)
if (is_numeric($val))
$xml.="&".$key.">".$val."";
$xml.="&".$key.">";
作用:将xml转为array
function xmlToArray($xml)
//将XML转为array
$array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $array_
作用:使用证书,以post方式提交xml到对应的接口url
function postXmlSSLCurl($xml,$url,$second=30)
$ch = curl_init();
//超时时间
curl_setopt($ch,CURLOPT_TIMEOUT,$second);
//这里设置代理,如果有的话
//curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');
//curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
//设置header
curl_setopt($ch,CURLOPT_HEADER,FALSE);
//要求结果为字符串且输出到屏幕上
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
//设置证书
//使用证书:cert 与 key 分别属于两个.pem文件
//默认格式为PEM,可以注释
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLCERT, $this->SSLCERT_PATH);
//默认格式为PEM,可以注释
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLKEY, $this->SSLKEY_PATH);
//post提交方式
curl_setopt($ch,CURLOPT_POST, true);
curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
$data = curl_exec($ch);
//返回结果
if($data){
curl_close($ch);
$error = curl_errno($ch);
echo "curl出错,错误码:$error"."";
curl_close($ch);
ok!此文半抄半写~总之代码没问题的~!分享创造动力,撸主继续干活了!
以上就是对微信退款接口demo,商户向用户转账,以零钱方式入账的相关介绍,希望对您学习PHP有所帮助,感谢您关注织梦者!
这些内容可能对你也有帮助
更多可查看PHP教程列表页。
猜您也会喜欢这些文章微信公众号授权,支付,退款总结
经过两周的研究,终于又把微信支付也搞定了。作为一个技术人员就应该有总结思考的习惯。这里将自己做微信踩过的一些坑,以及自己的思考记录下来,希望能帮助各位和我一样做微信支付的小伙伴。
1.支付前准备
1.1首先两个平台接入账户。
商户平台:
公众平台:
1.2两个平台的作用
3 商户平台:支付收款方,通俗点将就是网站用户支付的钱给谁。里面有商户的一些信息以及秘钥支付时要用。
4.公众号平台:在这里需要它提供网页授权的一些信息。
2.微信公众号支付流程
关于支付流程,官方给了一张很详细的流程图如下:
当然这是所有支付的流程图,在这里博主结合自己的实现方式也画了一张只有授权和公众号支付流程的图。大家可以参考有画的不对的地方还请路过的大牛多多指教。
3. 微信公众号支付的那些坑
1:获取授权的时候,访问授权接口不要用ajax提交。如果用ajax提交方式提交请求,微信服务端会报跨域请求不允许的错误。
2:获取授权openid的时候appid,secret一定要正确,这里的secret获取方式为下图,如果忘记,可以重置:
3:如果用的springmvc的框架,在统一支付接口记得用注解@ResponseBody,因为统一支付接口返回的数据一般是一个map,这个map中的数据前台页面要解析,所以需要这个注解。
4:调用统一支付接口时,请求报文是xml格式的,所以要把需要的参数转变为xml形式。
5:异步回调方法是支付成功后微信通知商户后台时调用,所以测试时需要在外网测试
7:授权时,只授一次就行,所以在授权之前判断是否已经授权。
8:微信支付以分为单位,支付金额需要注意转换单位。
9:如果签名失败,一定要仔细检查参数是否都拼接完毕,拼接正确,一般签名失败最可能的原因就是secret错误,应该去微信公众平台重新查找并且核对。
10:退款时,注意双向证书的路径。一般退款回调失败最可能的原因就是证书出错。
4. 微信公众号开发需要的一些官网网站
商户平台开发者文档网址
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4
用户授权需要查看的网址,重点查看用户管理相关说明
http://mp.weixin.qq.com/wiki/17/c0f37d13d5d2c37b468d75.html
商户平台微信支付网址
https://pay.weixin.qq.com/wiki/doc/api/index.html
商户平台登录网址
https://pay.weixin.qq.com/index.php/core/home/login?return_url=%2Findex.php%2Fcore%2Faccount
微信公众平台登录入口
https://mp.weixin.qq.com/
5.公众号支付代码
前端网页js代码
var outh = $.getUrlParam("outh");
if (!empty(outh)){
wxzhifu();
function getRequest() {
var url = location.
var theRequest = new Object();
if (url.indexOf("?") != -1) {
var str = url.substr(1);
strs = str.split("&");
for (var i = 0; i & strs. i++) {
theRequest[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]);
return theR
function saveOrder(){
var mode = "";
if($("#AliPay")[0].checked) {
mode = "支付宝";
}else if($("#bankpay")[0].checked) {
mode = "银联支付";
}else if($("#wxpay")[0].checked) {
mode = "微信支付";
var dishjson = data.dishJ
var dishJson = (JSON.parse(dishjson))[0];
var oldcanpin = dishJson.
var newcanpin = oldcanpin + ",支付方式:"+
dishJson["canpin"] =
data["dishJson"] = JSON.stringify(dishJson);
var url="/cyDishorder/saveCyDcOrders";
var successfull= function (datas) {
var bizData=datas.bizD
pay_orderno = bizData.orderN
if(datas.rtnCode == "0000000"){
ajaxPostFun(url, data, successfull,null, "保存餐厅预定订单");
function pay() {
if($("#AliPay")[0].checked) {
location.href = server+"/AliPayDingCan/" + pay_
}else if($("#bankpay")[0].checked) {
location.href = server+"/CYChinapay/" + pay_
}else if($("#wxpay")[0].checked){
var url = server+"/Member/FindById/"+
var successFun = function (data) {
if(empty(data.bizData.openid)){
wxshouquan();
wxzhifu();
ajaxPostFun(url, {}, successFun, null, "查询用户是否授权");
layer.msg("请选择支付方式");
return false;
wxshouquan() {
location.href = server + "/CyWechatPay/outh?userid=" +
function wxzhifu(){
var url = server+"/CyWechatPay/unifiedorder";
ajaxPostFun(url, {userid:userid,orderno:pay_orderno}, function(res) {
var _data = res.bizD
function onBridgeReady(){
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId":_data.appId,
"timeStamp":_data.timeStamp,
"nonceStr":_data.nonceStr,
"package" :_data.package,
"signType":_data.signType,
"paySign": _data.paySign
function(ress){
alert( JSON.stringify(ress));
if(ress.err_msg == "get_brand_wcpay_request:ok" ) {
layer.msg("支付成功!",{time:2000});
}else if(ress.err_msg == "get_brand_wcpay_request:cancel"){
layer.msg("支付取消!",{time:2000});
layer.msg("未知错误!",{time:2000});
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
onBridgeReady();
}, null, "微信支付获取package包");
支付,退款,controller代码
@Controller
@RequestMapping(value = "/CyWechatPay")
public class CyWechatController {
@Autowired
private IMemberService memberS
@Autowired
private IMobileCyDishorderService mobileCyDishorderS
@Autowired
private IMobileMemberService mobileMemberS
@Autowired
private IMobileServiceStyleService mobileServiceStyleS
private static Logger logger = Logger.getLogger(CyWechatController.class);
private static String url_snsapi_base = "https://open.weixin.qq.com/connect/oauth2/authorize";
private static String url_access_token = "https://api.weixin.qq.com/sns/oauth2/access_token";
private static String url_unifiedorder = "https://api.mch.weixin.qq.com/pay/unifiedorder";
* 统一下单
* prepare_id 预付款id
* IOException
* JDOMException
@ResponseBody
@RequestMapping("/unifiedorder")
public Map&String, Object& unifiedorder(@RequestParam(value = "orderno", required = true)String orderno, String userid,HttpServletRequest request) throws Exception {
CyDishorderEntity orderEntity = (CyDishorderEntity) mobileCyDishorderService.findOne("orderNum", orderno);
String nonce_str = WxTool.getRandomCode(32);
Map&String,Object& memberEntity =memberService.findByid("id",userid);
String openid = memberEntity.get("openid").toString();
String xml = this.getXmlData(orderEntity.getRemarks(), nonce_str,
orderno, WxTool.getRemoteHost(request), new BigDecimal(orderEntity.getPayMoney()),openid);
logger.info("生成的订单信息======&" + xml);
String result = HttpRequest.httpsRequest("https://api.mch.weixin.qq.com/pay/unifiedorder", "POST", xml);
@SuppressWarnings("unchecked")
Map&String, Object& map2 = XMLUtil.doXMLParse(result);
logger.info("统一下单接口返回的结果集======&" + map2);
if (map2.get("return_code").toString().equalsIgnoreCase("SUCCESS")
&& map2.get("result_code").toString().equalsIgnoreCase("SUCCESS")) {
logger.info("微信预支付成功!");
Map&String, Object& map = new HashMap&String, Object&();
map.put("appId", map2.get("appid"));
map.put("timeStamp", Long.toString(System.currentTimeMillis() / 1000));
map.put("nonceStr", map2.get("nonce_str"));
map.put("package", "prepay_id=" + map2.get("prepay_id"));
map.put("signType", "MD5");
map.put("paySign", WxTool.getSignUtil(map, ConfigUtil.APP_SECRECT));
logger.info("统一下-------&" + map);
logger.info("微信预支付失败!");
return null;
* 申请退款
@RequestMapping("refund/{orderno}")
@ResponseBody
public String refund(@PathVariable String orderno) throws Exception {
CyDishorderEntity orderEntity = (CyDishorderEntity) mobileCyDishorderService.findOne("orderNum", orderno);
String nonce_str = WxTool.getRandomCode(32);
StringBuilder sb2 = new StringBuilder();
Map&String, Object& signMap = new HashMap&String, Object&();
signMap.put("appid",ConfigUtil.APPID);
signMap.put("mch_id",ConfigUtil.MCH_ID);
signMap.put("nonce_str",nonce_str);
signMap.put("op_user_id",ConfigUtil.MCH_ID);
signMap.put("out_trade_no",orderEntity.getOrderNum());
signMap.put("out_refund_no",orderEntity.getRefund_queryid());
signMap.put("refund_fee",new BigDecimal(orderEntity.getPayMoney()).multiply(new BigDecimal(100)).intValue());
signMap.put("total_fee",new BigDecimal(orderEntity.getPayMoney()).multiply(new BigDecimal(100)).intValue());
signMap.put("transaction_id","");
StringBuffer xml =new StringBuffer();
xml.append("&xml&");
xml.append("&appid&"+ConfigUtil.APPID+"&/appid&");
xml.append("&mch_id&"+ConfigUtil.MCH_ID+"&/mch_id&");
xml.append("&nonce_str&"+nonce_str+"&/nonce_str&");
xml.append("&op_user_id&"+ConfigUtil.MCH_ID+"&/op_user_id&");
xml.append("&out_refund_no&"+orderEntity.getRefund_queryid()+"&/out_refund_no&");
xml.append("&out_trade_no&"+orderEntity.getOrderNum()+"&/out_trade_no&");
xml.append("&refund_fee&"+new BigDecimal(orderEntity.getPayMoney()).multiply(new BigDecimal(100)).intValue()+"&/refund_fee&");
xml.append("&total_fee&"+new BigDecimal(orderEntity.getPayMoney()).multiply(new BigDecimal(100)).intValue()+"&/total_fee&");
xml.append("&transaction_id&"+"&/transaction_id&");
xml.append("&sign&"+WxTool.getSignUtil(signMap, ConfigUtil.APP_SECRECT)+"&/sign&");
xml.append("&/xml&");
logger.info("生成的申请退款信息=============================&" + xml.toString());
* JAVA使用证书文件
logger.info("加载证书开始=========================================》》》》》");
KeyStore keyStore = KeyStore.getInstance("PKCS12");
FileInputStream instream = new FileInputStream(new File("/home/smit/down/apiclient_cert.p12"));
keyStore.load(instream, ConfigUtil.MCH_ID.toCharArray());
} finally {
instream.close();
SSLContext sslcontext = null;
sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, ConfigUtil.MCH_ID.toCharArray()).build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[]{"TLSv1"}, null, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
HttpPost httppost = new HttpPost("https://api.mch.weixin.qq.com/secapi/pay/refund");
StringEntity se = new StringEntity(xml.toString(), "UTF-8");
httppost.setEntity(se);
CloseableHttpResponse responseEntry = null;
String xmlStr2 = null;
responseEntry = httpclient.execute(httppost);
HttpEntity entity = responseEntry.getEntity();
if (entity != null) {
BufferedReader bufferedReader = null;
bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));
while ((xmlStr2 = bufferedReader.readLine()) != null) {
sb2.append(xmlStr2);
Map&String, Object& map = XMLUtil.doXMLParse(sb2.toString());
logger.info("申请退款接口返回的结果集======&" + map);
if (map.get("return_code").toString().equalsIgnoreCase("SUCCESS")
&& map.get("result_code").toString().equalsIgnoreCase("SUCCESS")) {
logger.info("****************退款申请成功!**********************");
orderEntity.setOrderStatus(CyOrderStatusEnum.REFUND_SUCCESS.getCode());
mobileCyDishorderService.update(orderEntity);
return "SUCCESS";
logger.info("*****************退款申请失败!*********************");
return "FAIL";
private static String getXmlData(String body, String nonce_str, String tradeNo,
String ip, BigDecimal totla, String openid) throws Exception {
Map&String, Object& signMap = new HashMap&String, Object&();
signMap.put("appid", ConfigUtil.APPID);
signMap.put("nonce_str", nonce_str);
signMap.put("body", body);
signMap.put("mch_id", ConfigUtil.MCH_ID);
signMap.put("notify_url", "http://域名/CyWechatPay/paysuccess.do");
signMap.put("out_trade_no", tradeNo);
signMap.put("total_fee", totla.multiply(new BigDecimal(100)).intValue());
signMap.put("trade_type", "JSAPI");
signMap.put("spbill_create_ip", ip);
signMap.put("openid", openid);
StringBuffer xml = new StringBuffer();
xml.append("&xml&");
xml.append("&appid&" + signMap.get("appid") + "&/appid&");
xml.append("&body&" + signMap.get("body") + "&/body&");
xml.append("&mch_id&" + signMap.get("mch_id") + "&/mch_id&");
xml.append("&nonce_str&" + signMap.get("nonce_str") + "&/nonce_str&");
xml.append("&notify_url&" + signMap.get("notify_url") + "&/notify_url&");
xml.append("&openid&" + signMap.get("openid") + "&/openid&");
xml.append("&out_trade_no&" + signMap.get("out_trade_no") + "&/out_trade_no&");
xml.append("&spbill_create_ip&" + signMap.get("spbill_create_ip") + "&/spbill_create_ip&");
xml.append("&total_fee&" + signMap.get("total_fee") + "&/total_fee&");
xml.append("&trade_type&" + signMap.get("trade_type") + "&/trade_type&");
xml.append("&sign&" + WxTool.getSignUtil(signMap, ConfigUtil.APP_SECRECT) + "&/sign&");
xml.append("&/xml&");
return xml.toString();
@RequestMapping(value = "/paysuccess")
public void PaySuccess(HttpServletRequest request, HttpServletResponse response){
logger.info("微信支付回调开始========================================================");
PrintWriter print = null;
InputStream inStream = request.getInputStream();
ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inStream.read(buffer)) != -1) {
outSteam.write(buffer, 0, len);
outSteam.close();
inStream.close();
String result = new String(outSteam.toByteArray(), "utf-8");
@SuppressWarnings("unchecked")
Map&Object, Object& map = XMLUtil.doXMLParse(result);
logger.info("微信返回的信息:"+map.toString());
if (map.get("result_code").toString().equalsIgnoreCase("SUCCESS")
&& map.get("return_code").toString().equalsIgnoreCase("SUCCESS")) {
String tradeNo = map.get("out_trade_no").toString();
CyDishorderEntity
order =(CyDishorderEntity)mobileCyDishorderService.findOne("orderNum",tradeNo);
if(order!=null && order.getOrderStatus().equals(CyOrderStatusEnum.PREPAID.getCode())){
response.getWriter().write(
"&xml&&return_code&&![CDATA[SUCCESS]]&&/return_code&&return_msg&&![CDATA[OK]]&&/return_msg&&/xml&");
updateOrder(map);
response.getWriter().write(
"&xml&&return_code&&![CDATA[SUCCESS]]&&/return_code&&return_msg&&![CDATA[OK]]&&/return_msg&&/xml&");
}catch (Exception e) {
e.printStackTrace();
* 用户授权
* response
* IOException
@RequestMapping("/outh")
public void outh(@RequestParam(value = "userid", required = true) int userid,
HttpServletResponse response, HttpServletRequest request) {
StringBuffer url = request.getRequestURL();
String redirecturl = URLEncoder.encode(new String(("http://域名/CyWechatPay/getopenid.do?userid=" + userid).getBytes("utf-8"), "utf-8"),"utf-8");
logger.info("[微信获取OPENID回调地址]"+redirecturl);
response.sendRedirect("https://open.weixin.qq.com/connect/oauth2/authorize?appid="
+ ConfigUtil.APPID
+ "&redirect_uri="
+ redirecturl
+ "&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect");
} catch (IOException e) {
e.printStackTrace();
* 商户获取用户资料
* IOException
@RequestMapping("/getopenid")
public void getopenid(@RequestParam(value = "userid", required = true) int userid,
HttpServletRequest request, HttpServletResponse response) {
String code = request.getParameter("code");
Map&String, Object& map = null;
Map&String, Object& map2 = null;
logger.info("[获取授权的access_token和openid]");
map = WXUtils.requestUrl("https://api.weixin.qq.com/sns/oauth2/access_token?appid="
+ ConfigUtil.APPID
+ "&secret="
+ConfigUtil.APP_SECRECT
+ "&code="
+ "&grant_type=authorization_code");
String access_token = map.get("access_token").toString();
String openid = map.get("openid").toString();
map2 = WXUtils.requestUrl("https://api.weixin.qq.com/sns/userinfo?access_token=" + access_token + "&openid=" + openid + "&lang=zh_CN");
memberService.updateuser(Integer.valueOf(userid),openid);
response.sendRedirect("http://域名/Mobile/cyLijiZhifuX.html?=outh=outh");
} catch (IOException e) {
e.printStackTrace();
private void
updateOrder(Map&Object, Object& map) {
以上为个人在做完微信支付后的一些总结,如有疑问请加qq群:咨询。
微信公众号支付/退款(java环境)开发介绍
微信支付回调地址与退款
微信支付---申请退款的https双向认证demo
微信支付异步回调,带你解决微信支付的深坑
微信支付 关于XML解析存在的安全问题指引
微信支付回调node.js版数据解析问题
微信api退款及退款查询
微信支付接口 退款接口
微信申请退款接口及调用模板消息接口
微信支付异步回调的坑,调用成功了回调地址却没有数据
没有更多推荐了,

我要回帖

更多关于 微信签到一天10元 的文章

 

随机推荐