wxpay.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <?php
  2. /**
  3. * JS_API支付demo
  4. * ====================================================
  5. * 在微信浏览器里面打开H5网页中执行JS调起支付。接口输入输出数据格式为JSON。
  6. * 成功调起支付需要三个步骤:
  7. * 步骤1:网页授权获取用户openid
  8. * 步骤2:使用统一支付接口,获取prepay_id
  9. * 步骤3:使用jsapi调起支付
  10. */
  11. include_once("lib/log_.php");
  12. include_once("lib/WxPayPubHelper.php");
  13. //使用jsapi接口
  14. $jsApi = new JsApi_pub();
  15. //以log文件形式记录回调信息
  16. $log_ = new Log_();
  17. $log_name="./notify_url.log";//log文件路径
  18. @$pay_sn = $_GET['pay_sn'];
  19. @$pay_amount = $_GET['pay_amount'];
  20. /*
  21. $log_->log_result($log_name,"【get pay_sn】:\n".$pay_sn."\n");
  22. $log_->log_result($log_name,"【get pay_amount】:\n".$pay_amount."\n");
  23. if(!isset($_COOKIE['pay_sn'])||!isset($_COOKIE['pay_amount']))
  24. {
  25. $expire = time() + 86400; // 设置24小时的有效期
  26. setcookie ("pay_sn", $pay_sn, $expire); // 设置一个名字为var_name的cookie,并制定了有效期
  27. setcookie ("pay_amount", $pay_amount, $expire); // 再将过期时间设置进cookie以便你能够知道var_name的过期时间
  28. $pay_sn = $_COOKIE['pay_sn'];
  29. $pay_amount = $_COOKIE['pay_amount'];
  30. }
  31. else
  32. {
  33. $pay_sn = $_COOKIE['pay_sn'];
  34. $pay_amount = $_COOKIE['pay_amount'];
  35. }
  36. $log_->log_result($log_name,"【cookie pay_sn】:\n".$pay_sn."\n");
  37. $log_->log_result($log_name,"【cookie pay_amount】:\n".$pay_amount."\n");
  38. */
  39. //=========步骤1:网页授权获取用户openid============
  40. //通过code获得openid
  41. if (!isset($_GET['code']))
  42. {
  43. if(isset($_COOKIE['pay_sn']))
  44. {
  45. unset($_COOKIE['pay_sn']);
  46. }
  47. if(isset($_COOKIE['pay_amount']))
  48. {
  49. unset($_COOKIE['pay_amount']);
  50. }
  51. $expire = time() + 120; // 设置2分钟的有效期
  52. setcookie ("pay_sn", $pay_sn, $expire); // 设置一个名字为var_name的cookie,并制定了有效期
  53. setcookie ("pay_amount", $pay_amount, $expire); // 再将过期时间设置进cookie以便你能够知道var_name的过期时间
  54. //触发微信返回code码
  55. $url = $jsApi->createOauthUrlForCode(WxPayConf_pub::JS_API_CALL_URL);
  56. Header("Location: $url");
  57. }else
  58. {
  59. if(isset($_COOKIE['pay_sn']))
  60. {
  61. $pay_sn = $_COOKIE['pay_sn'];
  62. unset($_COOKIE['pay_sn']);
  63. }
  64. if(isset($_COOKIE['pay_amount']))
  65. {
  66. $pay_amount = $_COOKIE['pay_amount'];
  67. unset($_COOKIE['pay_amount']);
  68. }
  69. //获取code码,以获取openid
  70. $code = $_GET['code'];
  71. $jsApi->setCode($code);
  72. $openid = $jsApi->getOpenId();
  73. $log_->log_result($log_name,"【CODE】:\n".$code."\n");
  74. $log_->log_result($log_name,"【openid】:\n".$openid."\n");
  75. }
  76. //=========步骤2:使用统一支付接口,获取prepay_id============
  77. //使用统一支付接口
  78. $unifiedOrder = new UnifiedOrder_pub();
  79. //设置统一支付接口参数
  80. //设置必填参数
  81. //appid已填,商户无需重复填写
  82. //mch_id已填,商户无需重复填写
  83. //noncestr已填,商户无需重复填写
  84. //spbill_create_ip已填,商户无需重复填写
  85. //sign已填,商户无需重复填写
  86. //自定义订单号,此处仅作举例
  87. $timeStamp = time();
  88. $out_trade_no = WxPayConf_pub::APPID."$timeStamp";
  89. $unifiedOrder->setParameter("openid","$openid");//openid描述
  90. $unifiedOrder->setParameter("body","$pay_sn");//商品描述
  91. $unifiedOrder->setParameter("out_trade_no","$pay_sn");//商户订单号
  92. $wx_pay_amount = floatval($pay_amount)*100;
  93. $unifiedOrder->setParameter("total_fee","$wx_pay_amount");//总金额
  94. $unifiedOrder->setParameter("notify_url",WxPayConf_pub::NOTIFY_URL);//通知地址
  95. $unifiedOrder->setParameter("trade_type","JSAPI");//交易类型
  96. //非必填参数,商户可根据实际情况选填
  97. //$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商户号
  98. //$unifiedOrder->setParameter("device_info","XXXX");//设备号
  99. //$unifiedOrder->setParameter("attach","XXXX");//附加数据
  100. //$unifiedOrder->setParameter("time_start","XXXX");//交易起始时间
  101. //$unifiedOrder->setParameter("time_expire","XXXX");//交易结束时间
  102. //$unifiedOrder->setParameter("goods_tag","XXXX");//商品标记
  103. //$unifiedOrder->setParameter("openid","XXXX");//用户标识
  104. //$unifiedOrder->setParameter("product_id","$pay_sn");//传入交易内部订单号
  105. $prepay_id = $unifiedOrder->getPrepayId();
  106. //=========步骤3:使用jsapi调起支付============
  107. $jsApi->setPrepayId($prepay_id);
  108. $jsApiParameters = $jsApi->getParameters();
  109. //echo $jsApiParameters;
  110. ?>
  111. <html>
  112. <head>
  113. <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
  114. <title>微信安全支付</title>
  115. <script type="text/javascript">
  116. //调用微信JS api 支付
  117. function jsApiCall()
  118. {
  119. WeixinJSBridge.invoke(
  120. 'getBrandWCPayRequest',
  121. <?php echo $jsApiParameters; ?>,
  122. function(res){
  123. WeixinJSBridge.log(res.err_msg);
  124. //alert(res.err_code+res.err_desc+res.err_msg);
  125. }
  126. );
  127. }
  128. function callpay()
  129. {
  130. if (typeof WeixinJSBridge == "undefined"){
  131. if( document.addEventListener ){
  132. document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
  133. }else if (document.attachEvent){
  134. document.attachEvent('WeixinJSBridgeReady', jsApiCall);
  135. document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
  136. }
  137. }else{
  138. jsApiCall();
  139. }
  140. }
  141. </script>
  142. </head>
  143. <body onload="callpay();">
  144. </br></br></br></br>
  145. <div align="center">
  146. <p style="font-size: 32px;">微信交易号:<?php echo $pay_sn; ?></p>
  147. <p style="font-size: 32px;">金额:<?php echo $pay_amount; ?>元</p>
  148. <button style="width:70%; height:100px; background-color:#FE6714; border:0px #FE6714 solid; cursor: pointer; color:white; font-size:32px;" type="button" onclick="history.back()" >返回订单列表</button>
  149. </div>
  150. </body>
  151. </html>