1、一定要区分小程序和公众号的退款,唯一的区别就是 appid不一样,其他的都是一样的。

不废话,直接写代码了啊。 放大招!!!

然后,需要注意的:最好是把证书放在下面的php的同级或者下级。

证书的路径一定要是服务器的根路径,比如E:\tupuu\WWW\XXX。而像http://www.xxx.com/../.. 是不行的,会报58错误。

DEMO1、用来调试退款流程,在浏览器直接访问这个php文件。

  1. <?php
  2. /**
  3. * 微信公众号和小程序退款申请接口-demo
  4. * ====================================================
  5. * 注意:同一笔单的部分退款需要设置相同的订单号和不同的
  6. * out_refund_no。一笔退款失败后重新提交,要采用原来的
  7. * out_refund_no。总退款金额不能超过用户实际支付金额(现
  8. * 金券金额不能退款)。
  9. */
  10. //include_once(S_ROOT ."xxpay/WxPayPubHelper/WxPayPubHelper.miniprogram.php");
  11. //输入需退款的订单号
  12. if (!isset($_POST["out_trade_no"]) || !isset($_POST["refund_fee"]))
  13. {
  14. $out_trade_no = " ";
  15. $refund_fee = "1";
  16. }else{
  17. //echo "退款订单号:".$_POST['out_trade_no'];
  18. $order_msg= array(
  19. 'out_trade_no'=>'homeX20171206155833_1180',
  20. 'out_trade_no'=>'homeX20171206155833_1180',
  21. 'order_amount'=>'0.02',
  22.  
  23. );
  24.  
  25. $appid = 'wx60****d';//如果是公众号 就是公众号的appid;小程序就是小程序的appid
  26. $mch_id = '126****01';
  27. $KEY = 'xixi***09000908bkj';
  28. $nonce_str = randomkeys(32);//随机字符串
  29. $op_user_id = $mch_id;
  30. $out_trade_no = $order_msg['out_trade_no'];//商户传微信的订单号
  31. $out_refund_no = $order_msg['out_trade_no'];//用户请求退款id对应的out_trade_no订单号
  32. $refund_fee =1;//退款金额
  33. $total_fee = 2;//订单总金额
  34.  
  35. //这里是按照顺序的 因为下面的签名是按照(字典序)顺序 排序错误 肯定出错
  36. $post['appid'] = $appid;
  37. $post['mch_id'] = $mch_id;
  38. $post['nonce_str'] = $nonce_str;//随机字符串
  39. $post['op_user_id'] = $mch_id;
  40. $post['out_refund_no'] = $out_refund_no;
  41. $post['out_trade_no'] = $out_trade_no;
  42. $post['refund_fee'] = $refund_fee;
  43. $post['total_fee'] = $total_fee; //总金额 最低为一分钱 必须是整数
  44.  
  45. $sign = MakeSign($post,$KEY); //签名
  46.  
  47. $post_xml = '<xml>
  48. <appid>'.$appid.'</appid>
  49. <mch_id>'.$mch_id.'</mch_id>
  50. <nonce_str>'.$nonce_str.'</nonce_str>
  51. <op_user_id>'.$mch_id.'</op_user_id>
  52. <out_refund_no>'.$out_refund_no.'</out_refund_no>
  53. <out_trade_no>'.$out_trade_no.'</out_trade_no>
  54. <refund_fee>'.$refund_fee.'</refund_fee>
  55. <total_fee>'.$total_fee.'</total_fee>
  56. <sign>'.$sign.'</sign>
  57. </xml>';
  58. //echo $post_xml;
  59. //申请退款接口
  60. $url = 'https://api.mch.weixin.qq.com/secapi/pay/refund';
  61. $xml = curl_post_ssl($url,$post_xml); //POST方式请求http,支付无需证书;申请退款api需要证书校验
  62. $array = xml2array($xml); //将【申请退款】api返回xml数据转换成数组,全要大写
  63. //var_dump($array);
  64. if($array['RETURN_CODE'] == 'SUCCESS' && $array['RESULT_CODE'] == 'SUCCESS'){//退款业务已受理//
  65.  
  66. // $up['order_status'] = 'refunding'; //退款申请中
  67. // $up['order_id'] = $order_id;
  68. // $up['order_time'] = time(); //退款申请时间
  69. // if(M("home_order","xxf_witkey_")->save($up)){
  70. // $model_demo = new \Home\Model\HomeorderModel('home_order','xxf_witkey_');
  71. // $res = $model_demo->home_order_list($userwx_info['uid'],19);
  72. // if(!$res){
  73. // exit('订单信息有误');
  74. // }else{
  75. // echo json_encode($res);exit;
  76. // }
  77. // }
  78.       // for 调试
  79. echo "业务结果:".$array['RETURN_CODE']."<br>";
  80. echo "错误代码:".$array['err_code']."<br>";
  81. echo "错误代码描述:".$array['err_code_des']."<br>";
  82. echo "公众账号ID:".$array['APPID']."<br>";
  83. echo "商户号:".$array['MCH_ID']."<br>";
  84. echo "子商户号:".$array['sub_mch_id']."<br>";
  85. echo "设备号:".$array['device_info']."<br>";
  86. echo "签名:".$array['SIGN']."<br>";
  87. echo "微信订单号:".$array['transaction_id']."<br>";
  88. echo "商户订单号:".$array['OUT_TRADE_NO']."<br>";
  89. echo "商户退款单号:".$array['OUT_REFUND_NO']."<br>";
  90. echo "微信退款单号:".$array['refund_idrefund_id']."<br>";
  91. echo "订单总金额:".$array['TOTAL_FEE']."<br>";
  92. echo "退款金额:".$array['REFUND_FEE']."<br>";
  93. echo "现金券退款金额:".$array['coupon_refund_fee']."<br>";
  94.  
  95. }else{
  96. echo "RETURN_CODE:".$array['RETURN_CODE']."<br>";
  97. echo "RESULT_CODE:".$array['RESULT_CODE']."<br>";
  98. echo $array['RETURN_MSG']."<br>";
  99. echo "错误代码:".$array['ERR_CODE']."<br>";
  100. echo "错误代码描述:".$array['ERR_CODE_DES']."<br>";
  101. exit
  102. echo $array['RETURN_MSG'];exit;
  103. }
  104. }
  105.  
  106. /* php获取随机字符(数字+英文)函数,长度可以进行控制 */
  107. function randomkeys($length) {
  108. $key = null;
  109. $pattern = '1234567890abcdefghijklmnopqrstuvwxyz
  110. ABCDEFGHIJKLOMNOPQRSTUVWXYZ';
  111. for ($i = 0; $i < $length; $i++) {
  112. $key .= $pattern {mt_rand(0, 35)};
  113. }
  114. return $key;
  115. }
  116. /**
  117. * 生成签名, $KEY就是支付key
  118. * @return 签名
  119. */
  120. function MakeSign( $params,$KEY){
  121. //签名步骤一:按字典序排序数组参数
  122. ksort($params);
  123. $string = ToUrlParams($params); //参数进行拼接key=value&k=v
  124. //签名步骤二:在string后加入KEY
  125. $string = $string . "&key=".$KEY;
  126. //签名步骤三:MD5加密
  127. $string = md5($string);
  128. //签名步骤四:所有字符转为大写
  129. $result = strtoupper($string);
  130. return $result;
  131. }
  132. /**
  133. * 将参数拼接为url: key=value&key=value
  134. * @param $params
  135. * @return string
  136. */
  137. function ToUrlParams( $params ){
  138. $string = '';
  139. if( !empty($params) ){
  140. $array = array();
  141. foreach( $params as $key => $value ){
  142. $array[] = $key.'='.$value;
  143. }
  144. $string = implode("&",$array);
  145. }
  146. return $string;
  147. }
  148. //获取xml里面数据,转换成array
  149. function xml2array($xml){
  150. $p = xml_parser_create();
  151. xml_parse_into_struct($p, $xml, $vals, $index);
  152. xml_parser_free($p);
  153. $data = "";
  154. foreach ($index as $key=>$value) {
  155. if($key == 'xml' || $key == 'XML') continue;
  156. $tag = $vals[$value[0]]['tag'];
  157. $value = $vals[$value[0]]['value'];
  158. $data[$tag] = $value;
  159. }
  160. return $data;
  161. }
  162. function curl_post_ssl($url, $vars, $second=30,$aHeader=array())
  163. {
  164. $ch = curl_init();
  165. //超时时间
  166. curl_setopt($ch,CURLOPT_TIMEOUT,$second);
  167. curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
  168. //这里设置代理,如果有的话
  169. //curl_setopt($ch,CURLOPT_PROXY, '10.206.30.98');
  170. //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
  171. curl_setopt($ch,CURLOPT_URL,$url);
  172. curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
  173. curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
  174.  
  175. //以下两种方式需选择一种
  176.  
  177. //第一种方法,cert 与 key 分别属于两个.pem文件
  178. //默认格式为PEM,可以注释
  179. curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
  180. curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/cert/apiclient_cert.pem');//getcwd()=》当前工作目录,不含最下级的/
  181. //默认格式为PEM,可以注释
  182. curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
  183. curl_setopt($ch,CURLOPT_SSLKEY,getcwd().'/cert/apiclient_key.pem');
  184.  
  185. //第二种方式,两个文件合成一个.pem文件
  186. //curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.pem');
  187.  
  188. if( count($aHeader) >= 1 ){
  189. curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
  190. }
  191.  
  192. curl_setopt($ch,CURLOPT_POST, 1);
  193. curl_setopt($ch,CURLOPT_POSTFIELDS,$vars);
  194. $data = curl_exec($ch); //返回xml
  195. if($data){
  196. curl_close($ch);
  197. return $data;
  198. }
  199. else {
  200. $error = curl_errno($ch);
  201. echo "call faild, errorCode:$error\n";
  202. curl_close($ch);
  203. return false;
  204. }
  205. }
  206.  
  207. ?>
  208.  
  209. <!DOCTYPE HTML>
  210. <html>
  211. <head>
  212. <meta charset="UTF-8">
  213. <title>微信安全支付</title>
  214. </head>
  215. <body>
  216. </br></br></br></br>
  217. <div align="center">
  218. <form action="./refund_miniprogram.php" method="post">
  219. <p>申请退款:</p>
  220. <p>退款单号: <input type="text" name="out_trade_no" value=<?php echo $out_trade_no; ?> ></p>
  221. <p>退款金额(分): <input type="text" name="refund_fee" value=<?php echo $refund_fee; ?> ></p>
  222. <button type="submit" >提交</button>
  223. </form>
  224.  
  225. </br>
  226. <a href="../index.php">返回首页</a>
  227.  
  228. </div>
  229. </body>
  230. </html>

DEMO2、在其他的php文件中引用该退款流程

  1. //在这里将订单的id、out_trade_no、out_refund_no、总金额、退款金额都拿到,然后进行下面步骤
    include_once S_ROOT.'xxpay/wxzf/refund_miniprogram.php'; //小程序退款
  1. <?php
  2. /**
  3. * 退款申请接口-demo
  4. * ====================================================
  5. * 注意:同一笔单的部分退款需要设置相同的订单号和不同的
  6. * out_refund_no。一笔退款失败后重新提交,要采用原来的
  7. * out_refund_no。总退款金额不能超过用户实际支付金额(现
  8. * 金券金额不能退款)。
  9. */
  10.  
  11. $appid = 'wx6***1d';//如果是公众号 就是公众号的appid;小程序就是小程序的appid
  12. $mch_id = '12*****201';
  13. $KEY = 'xi***********kj';
  14. $nonce_str = randomkeys(32);//随机字符串
  15. $op_user_id = $mch_id;
  16. $out_trade_no = $order_no['out_trade_no'];//商户传微信的订单号
  17. $out_refund_no = $order_no['out_trade_no'];//用户请求退款id对应的out_trade_no订单号
  18. // $refund_fee = 1;//退款金额
  19. // $total_fee = 2;//订单总金额
  20. $refund_fee = intval($refund_amount*100);//退款金额
  21. $total_fee = intval($total_amount*100);//订单总金额
  22.  
  23. //这里是按照顺序的 因为下面的签名是按照(字典序)顺序 排序错误 肯定出错
  24. $post['appid'] = $appid;
  25. $post['mch_id'] = $mch_id;
  26. $post['nonce_str'] = $nonce_str;//随机字符串
  27. $post['op_user_id'] = $mch_id;
  28. $post['out_refund_no'] = $out_refund_no;
  29. $post['out_trade_no'] = $out_trade_no;
  30. $post['refund_fee'] = $refund_fee;
  31. $post['total_fee'] = $total_fee; //总金额 最低为一分钱 必须是整数
  32.  
  33. $sign = MakeSign($post,$KEY); //签名
  34.  
  35. $post_xml = '<xml>
  36. <appid>'.$appid.'</appid>
  37. <mch_id>'.$mch_id.'</mch_id>
  38. <nonce_str>'.$nonce_str.'</nonce_str>
  39. <op_user_id>'.$mch_id.'</op_user_id>
  40. <out_refund_no>'.$out_refund_no.'</out_refund_no>
  41. <out_trade_no>'.$out_trade_no.'</out_trade_no>
  42. <refund_fee>'.$refund_fee.'</refund_fee>
  43. <total_fee>'.$total_fee.'</total_fee>
  44. <sign>'.$sign.'</sign>
  45. </xml>';
  46. //echo $post_xml;
  47. //申请退款接口
  48. $url = 'https://api.mch.weixin.qq.com/secapi/pay/refund';
  49. $xml = curl_post_ssl($url,$post_xml); //POST方式请求http,支付无需证书;申请退款api需要证书校验
  50. $array = xml2array($xml); //将【申请退款】api返回xml数据转换成数组,全要大写
  51. //var_dump($array);
  52. if($array['RETURN_CODE'] == 'SUCCESS' && $array['RESULT_CODE'] == 'SUCCESS'){//退款业务已受理//
  53. //数据库更新操作
  54.  
  55. /* for 调试 */
  56. // echo "业务结果:".$array['RETURN_CODE']."<br>";
  57. // echo "错误代码:".$array['err_code']."<br>";
  58. // echo "错误代码描述:".$array['err_code_des']."<br>";
  59. // echo "公众账号ID:".$array['APPID']."<br>";
  60. // echo "商户号:".$array['MCH_ID']."<br>";
  61. // echo "子商户号:".$array['sub_mch_id']."<br>";
  62. // echo "设备号:".$array['device_info']."<br>";
  63. // echo "签名:".$array['SIGN']."<br>";
  64. // echo "微信订单号:".$array['transaction_id']."<br>";
  65. // echo "商户订单号:".$array['OUT_TRADE_NO']."<br>";
  66. // echo "商户退款单号:".$array['OUT_REFUND_NO']."<br>";
  67. // echo "微信退款单号:".$array['refund_idrefund_id']."<br>";
  68. // echo "订单总金额:".$array['TOTAL_FEE']."<br>";
  69. // echo "退款金额:".$array['REFUND_FEE']."<br>";
  70. // echo "现金券退款金额:".$array['coupon_refund_fee']."<br>";
  71.  
  72. }else{
  73. echo "RETURN_CODE:".$array['RETURN_CODE']."<br>";
  74. echo "RESULT_CODE:".$array['RESULT_CODE']."<br>";
  75. echo $array['RETURN_MSG']."<br>";
  76. echo "错误代码:".$array['ERR_CODE']."<br>";
  77. echo "错误代码描述:".$array['ERR_CODE_DES']."<br>";
  78. exit;
  79. }
  80. // }
  81.  
  82. /* php获取随机字符(数字+英文)函数,长度可以进行控制 */
  83. function randomkeys($length) {
  84. $key = null;
  85. $pattern = '1234567890abcdefghijklmnopqrstuvwxyz
  86. ABCDEFGHIJKLOMNOPQRSTUVWXYZ';
  87. for ($i = 0; $i < $length; $i++) {
  88. $key .= $pattern {mt_rand(0, 35)};
  89. }
  90. return $key;
  91. }
  92. /**
  93. * 生成签名, $KEY就是支付key
  94. * @return 签名
  95. */
  96. function MakeSign( $params,$KEY){
  97. //签名步骤一:按字典序排序数组参数
  98. ksort($params);
  99. $string = ToUrlParams($params); //参数进行拼接key=value&k=v
  100. //签名步骤二:在string后加入KEY
  101. $string = $string . "&key=".$KEY;
  102. //签名步骤三:MD5加密
  103. $string = md5($string);
  104. //签名步骤四:所有字符转为大写
  105. $result = strtoupper($string);
  106. return $result;
  107. }
  108. /**
  109. * 将参数拼接为url: key=value&key=value
  110. * @param $params
  111. * @return string
  112. */
  113. function ToUrlParams( $params ){
  114. $string = '';
  115. if( !empty($params) ){
  116. $array = array();
  117. foreach( $params as $key => $value ){
  118. $array[] = $key.'='.$value;
  119. }
  120. $string = implode("&",$array);
  121. }
  122. return $string;
  123. }
  124. //获取xml里面数据,转换成array,key键均大写
  125. function xml2array($xml){
  126. $p = xml_parser_create();
  127. xml_parse_into_struct($p, $xml, $vals, $index);
  128. xml_parser_free($p);
  129. $data = "";
  130. foreach ($index as $key=>$value) {
  131. if($key == 'xml' || $key == 'XML') continue;
  132. $tag = $vals[$value[0]]['tag'];
  133. $value = $vals[$value[0]]['value'];
  134. $data[$tag] = $value;
  135. }
  136. return $data;
  137. }
  138. function curl_post_ssl($url, $vars, $second=30,$aHeader=array())
  139. {
  140. $ch = curl_init();
  141. //超时时间
  142. curl_setopt($ch,CURLOPT_TIMEOUT,$second);
  143. curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
  144. //这里设置代理,如果有的话
  145. //curl_setopt($ch,CURLOPT_PROXY, '10.206.30.98');
  146. //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
  147. curl_setopt($ch,CURLOPT_URL,$url);
  148. curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
  149. curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
  150.  
  151. //以下两种方式需选择一种
  152.  
  153. //第一种方法,cert 与 key 分别属于两个.pem文件
  154. //默认格式为PEM,可以注释
  155. curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
  156. //curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/cert/apiclient_cert.pem');//getcwd()=》当前工作目录,不含最下级的/
  157. curl_setopt($ch,CURLOPT_SSLCERT,S_ROOT.'x**ay/wxzf/cert/apiclient_cert.pem');//这种获取绝对路径,请使用文件根目录E:\putuu\WWW\你的项目放置文件夹名\,而非站点目录
  158. //默认格式为PEM,可以注释
  159. curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
  160. //curl_setopt($ch,CURLOPT_SSLKEY,getcwd().'/cert/apiclient_key.pem');
  161. curl_setopt($ch,CURLOPT_SSLKEY,S_ROOT.'x**ay/wxzf/cert/apiclient_key.pem');
  162.  
  163. //第二种方式,两个文件合成一个.pem文件
  164. //curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.pem');
  165.  
  166. if( count($aHeader) >= 1 ){
  167. curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
  168. }
  169.  
  170. curl_setopt($ch,CURLOPT_POST, 1);
  171. curl_setopt($ch,CURLOPT_POSTFIELDS,$vars);
  172. $data = curl_exec($ch); //返回xml
  173. if($data){
  174. curl_close($ch);
  175. return $data;
  176. }
  177. else {
  178. $error = curl_errno($ch);
  179. echo "call faild, errorCode:$error\n";
  180. curl_close($ch);
  181. return false;
  182. }
  183. }
  184.  
  185. ?>

退款部分结束。

下面是退款回调

DEMO3、退款回调

1)首先去:商户平台-交易中心-退款配置中配置notify_url。(和支付回调类似)

2)解密步骤:

3)上面的加密串A是什么?回答:XML里面的<req_info>字段。

4)如何获取?==》核心:  refund_decrypt($str, $key)    :其中参数$str是加密串A<req_info>(string类型),参数$key是md5后的商户key。

//明文=refund_decrypt(密文,MD5(商户秘钥));明文格式如下:

5)那么获得xml格式明文后,咋办?再次xml转array,得到里面的out_trade_no,订单号都得到了,你想干嘛干嘛去。至此,整个退款和回调结束。

下面附上代码:

  1. <?php
  2. //define ( "IN_KEKE", TRUE );
  3. //require_once (dirname ( dirname ( dirname ( __FILE__ ) ) ) . DIRECTORY_SEPARATOR . 'app_comm.php');//引入数据库db工厂和其他配置
  4.  
  5. //申请退款,微信公众号和小程序退款成功的回调url是同一个
  6. //举例如下:
  7. // <xml>
  8. // <return_code>SUCCESS</return_code>
  9. // <appid><![CDATA[wx2421b1c4370ec43b]]></appid>
  10. // <mch_id><![CDATA[10000100]]></mch_id>
  11. // <nonce_str><![CDATA[TeqClE3i0mvn3DrK]]></nonce_str>
  12. // <req_info><![CDATA[T87GAHG17TGAHG1TGHAHAHA1Y1CIOA9UGJH1GAHV871HAGAGQYQQPOOJMXNBCXBVNMNMAJAA]]></req_info>
  13. // </xml>
  14. //解密步骤如下:
  15. // (1)对加密串A<req_info>做base64解码,得到加密串B
  16. // (2)对商户key做md5,得到32位小写key* ( key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置 )
  17. // (3)用key*对加密串B做AES-256-ECB解密
  18.  
  19. //这里测试微信是否访问了当前url
  20. //$li = db_factory::execute ( sprintf ( " update %switkey_ho*** set order_status='refunded' where out_trade_no= '%s' ",TABLEPRE,'ho*****2') );
  21. //var_dump($li);
  22.  
  23. ///////////////////////////////////////////////////-------//////////////////////////////////
  24. //商户密钥$weixin_key,解密必要,按照上面步骤(2)(3)解密
  25. $weixin_key = '**********************';
  26.  
  27. $post = post_data(); //接受微信POST过来的XML数据
  28. $post_data = xml_to_array($post); //XML转数组Array
  29. $weixin_post_string = $post_data['req_info']; //微信post过来的加密串A,字符串类型
  30.  
  31. //明文=refund_decrypt(密文,MD5(商户秘钥));返回XML格式明文,包含out_trade_no/out_refund_no等信息
  32. $refund_xml_string = refund_decrypt($weixin_post_string, md5($weixin_key));
  33. $refundArr = xml_to_array($refund_xml_string);
  34. if(isset($refundArr['out_trade_no'])){//$refundArr['out_trade_no']字符串类型
  35. //数据库操作,将订单状态改为退款成功和其他操作
  36.  
  37. echo return_msg();
  38. }
  39.  
  40. //对参数加密串A<req_info>进行AES-256(ECB模式,PKCS7Padding)解密,得到加密前参数。
  41. function refund_decrypt($str, $key) {
  42. $str = base64_decode($str);
  43. $str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_ECB);
  44. $block = mcrypt_get_block_size('rijndael_128', 'ecb');
  45. $pad = ord($str[($len = strlen($str)) - 1]);
  46. $len = strlen($str);
  47. $pad = ord($str[$len - 1]);
  48. return substr($str, 0, strlen($str) - $pad);
  49. }
  50. /*
  51. * 微信是用$GLOBALS['HTTP_RAW_POST_DATA'];这个函数接收微信支付成功post给商户的数据
  52. */
  53. function post_data(){
  54. $receipt = $_REQUEST;
  55. if($receipt==null){
  56. $receipt = file_get_contents("php://input");
  57. if($receipt == null){
  58. $receipt = $GLOBALS['HTTP_RAW_POST_DATA'];
  59. }
  60. }
  61. return $receipt;
  62. }
  63. /**
  64. * 将xml转为array
  65. */
  66. function xml_to_array($xml){
  67. if(!$xml){
  68. return false;
  69. }
  70. //将XML转为array
  71. //禁止引用外部xml实体
  72. libxml_disable_entity_loader(true);
  73. $data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
  74. return $data;
  75. }
  76. /* 发送给微信的退款回调消息 -xzz1207 */
  77. function return_msg(){
  78. $msg = '<xml>
  79. <return_code><![CDATA[SUCCESS]]></return_code>
  80. <return_msg><![CDATA[OK]]></return_msg>
  81. </xml>';
  82.  
  83. return $msg;
  84. }
  85.  
  86. ?>

【微信小程序】退款功能教程(含申请退款和退款回调)的更多相关文章

  1. Django微信小程序后台开发教程

    本文链接:https://blog.csdn.net/qq_43467898/article/details/83187698Django微信小程序后台开发教程1 申请小程序,创建hello worl ...

  2. 微信小程序开发系列教程三:微信小程序的调试方法

    微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 这个教程的前两篇文章,介绍了如何用下图所示的微信开发者工具自动生成一个Hel ...

  3. [转] 扩展微信小程序框架功能

    通过第三方 JavaScript 库,扩展微信小程序框架功能. 扩展微信小程序框架功能(1)——Promise ES6 对 Promise 有了原生的支持,但微信开发者工具更新版本(0.11.1122 ...

  4. 微信小程序的功能开发工具跟公众号的差别,小程序是一种减负思维对简单APP是巨大打击

    微信小程序的功能开发工具跟公众号的差别,小程序是一种减负思维对简单APP是巨大打击 摘要: 小程序和公众号最大的区别有如下四点:1.小程序没有粉丝,开发者在后台能看到的只能是累计用户访问数以及实时统计 ...

  5. 微信小程序支付功能 C# .NET开发

    微信小程序支付功能的开发的时候坑比较多,不过对于钱的事谨慎也是好事.网上关于小程序支付的实例很多,但是大多多少有些问题,C#开发的更少.此篇文档的目的是讲开发过程中遇到的问题做一个备注,也方便其他开发 ...

  6. 微信小程序 - 定位功能

    (1) 查看微信小程序文档 大家可以从我截图中可以看到,API中的返回值有纬度和经度,所以我们接下来就是要用到纬度和经度逆地址解析出地址的一些信息. (2)注册腾讯地图开放平台 注册完之后选择WebS ...

  7. 微信小程序--分享功能

    微信小程序--分享功能 微信小程序前段时间开放了小程序右上角的分享功能, 可以分享任意一个页面到好友或者群聊, 但是不能分享到朋友圈 这里有微信开发文档链接:点击跳转到微信分享功能API 入口方法: ...

  8. 微信小程序开发入门教程(三)---小程序云开发支付功能

    支付(shoukuan)功能真的很重要!由于我还没有商户号,以下代码未实际验证 1.服务端 进入云开发,新建云函数pay(应该也可以在开发者工具编写后上传) 编写后端代码index.js这里用到第三方 ...

  9. 微信小程序详细图文教程-10分钟完成微信小程序开发部署发布

    很多朋友都认为微信小程序申请.部署.发布很难,需要很长时间. 实际上,微信和腾讯云同是腾讯产品,已经提供了10分钟(根据准备资源情况,已完成小程序申请认证)完成小程序开发.部署.发布的方式.当然,实现 ...

  10. 微信小程序 新手入门教程

    因为工作需要,最近学习了一下微信小程序,在此分享一下大概的流程. 强烈建议大家先去看微信小程序简易教程:点我进入 起步: 安装微信web开发软件者工具,需要破解的同学可以网上找破解教程,很简单的,这里 ...

随机推荐

  1. CodeForces - 875D High Cry

    题面在这里! 直接考虑每个位置成为最右边的最大值的位置,统计不合法区间,补集转化一下就好啦. 复杂度O(N * 30) #include<bits/stdc++.h> #define ll ...

  2. 【位运算】【BFS】移动玩具

    1054: [HAOI2008]移动玩具 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2246  Solved: 1246[Submit][Stat ...

  3. [Contest20171005]Maze

    考虑一个$N\times M$的网格,每个网格要么是空的,要么是障碍物.整个网格四周都是墙壁(即第$1$行和第$N$行,第$1$列和第$M$列都是墙壁),墙壁有且仅有两处开口,分别代表起点和终点.起点 ...

  4. Java学习笔记(11)

    自定义异常类: 自定义异常类的步骤:自定义一个类继承Exception即可 public class CustomClass { public static void main(String[] ar ...

  5. I/O多路复用机制:epoll

    在过去的linux 网络编程中,采用select来做事件触发,其缺点在于每次调用select,都需要把fd集合拷贝到内核,内核必须遍历传递进来的所有fd,这在fd很多时开销会很大,相比于select, ...

  6. XCode6 ,iOS之PCH文件配置

    1: 创建PCH文件 NewFile-->Other中的PCH File-->Next-->Create 2:配置PCH文件 项目中的TARGETS-->Build Setti ...

  7. Ubuntu 16.04搭建OpenVPN服务器以及客户端的使用

    说明:启动时注意用户权限,比如root用户启动. Ubuntu: 服务器环境:Ubuntu 16.04 64位系统 内网IP:10.143.80.116 外网IP:203.195.1.2 OpenVP ...

  8. Java将字符串写入文件与将文件内容读取到字符串

    原文:http://blog.csdn.net/liuweiyuxiang/article/details/69487326 将字符串写入文件 方法一 public void WriteStringT ...

  9. Setup JIRA Software 7.6.2 on Oracle Linux 6.8

    OS Oracle Linux 6.8 V138414-01.iso Database mysql5.6.30 MySQL-5.6.30-1.el6.x86_64.rpm-bundle.tar JIR ...

  10. Android-25种开源炫酷动画框架

    前言 忙碌的工作终于可以停息一段时间了,最近突然有一个想法,就是自己写一个app,所以找了一些合适开源控件,这样更加省时,再此分享给大家,希望能对大家有帮助,此博文介绍的都是UI上面的框架,接下来会有 ...