第一部分,将订单数据存入数据库并发起支付请求:
createOauthUrlForCode(WxPayConf_pub::JS_API_CALL_URL); Header("Location: $url"); }else{ //获取code码,以获取openid $code = $_GET['code']; $jsApi->setCode($code); $openid = $jsApi->getOpenId(); } //=========步骤2:使用统一支付接口,获取prepay_id============ //使用统一支付接口 $unifiedOrder = new UnifiedOrder_pub(); //设置统一支付接口参数 //设置必填参数 //appid已填,商户无需重复填写 //mch_id已填,商户无需重复填写 //noncestr已填,商户无需重复填写 //spbill_create_ip已填,商户无需重复填写 //sign已填,商户无需重复填写 $unifiedOrder->setParameter("openid","$openid");//商品描述 $unifiedOrder->setParameter("body","设备充值");//商品描述 //自定义订单号,此处仅作举例 $timeStamp = time(); $out_trade_no = WxPayConf_pub::APPID."$timeStamp"; $unifiedOrder->setParameter("out_trade_no","$out_trade_no");//商户订单号 $unifiedOrder->setParameter("total_fee",$_SESSION['price']);//总金额 $unifiedOrder->setParameter("notify_url",WxPayConf_pub::NOTIFY_URL);//通知地址 $unifiedOrder->setParameter("trade_type","JSAPI");//交易类型 //非必填参数,商户可根据实际情况选填 //$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商户号 //$unifiedOrder->setParameter("device_info","XXXX");//设备号 //$unifiedOrder->setParameter("attach","XXXX");//附加数据 //$unifiedOrder->setParameter("time_start","XXXX");//交易起始时间 //$unifiedOrder->setParameter("time_expire","XXXX");//交易结束时间 //$unifiedOrder->setParameter("goods_tag","XXXX");//商品标记 //$unifiedOrder->setParameter("openid","XXXX");//用户标识 //$unifiedOrder->setParameter("product_id","XXXX");//商品ID $prepay_id = $unifiedOrder->getPrepayId(); // ================将订单号、openid、电话号码、充值金额存入数据库================ mysql_connect('xxxxx','xxxx','xxxx') or die('连接数据库失败!'); mysql_select_db('xxxx') or die('选择数据库失败!'); mysql_query("SET NAMES UTF8"); // $radCard = ($_SESSION['price']/100); $radCard = $_SESSION['price']; $phoneNo = $_SESSION['phonenumber']; $selectSql = "select * from wx_pay where orders='$out_trade_no' order by id limit 0,1"; $result=mysql_query($selectSql); $num=mysql_num_rows($result); //获取行数 if($num == '0'){ //echo "没有这个订单,存数据库"; $sql="insert into wx_pay(orders,openid,phoneNo,radCard) value('$out_trade_no','$openid','$phoneNo','$radCard')"; if(mysql_query($sql)){ $_SESSION['orders'] = $out_trade_no; /* $_SESSION['radCard']=$radCard;// 数额 $_SESSION['phoneNo']=$phoneNo;// 电话号码 $_SESSION['openid']=$openid;// 用户的id $_SESSION['nickname']=$nickname;// 微信名称 $_SESSION['orders']=$orders;// 订单号 header("Location: http://www.sichang.com.cn/wx-pay/wx-pay/wx-pay-Orders.php?showwxpaytitle=1"); */ }else { echo "ERR"; } mysql_close(); }else{ echo "已经有订单号了"; // 判断是否支付,支付了就返回首页,没有就继续支付 $selectMark = "select * from wx_pay where orders='$out_trade_no' order by id limit 0,1"; $resultMark = mysql_query($sql); $orderMark=""; while($row = mysql_fetch_array($result)){ echo $row['Mark']; $orderMark = $row['Mark']; } if($orderMark == "1"){ header("Location: http://www.sichang.com.cn/wx-pay/wxCYouyun/wx-pay/index.php"); }else{ echo "可以支付"; } } //=========步骤3:使用jsapi调起支付============ $jsApi->setPrepayId($prepay_id); $jsApiParameters = $jsApi->getParameters(); //echo $jsApiParameters;?>
第二部分:支付后的回调,用来判断是否支付成功
saveData($xml); //验证签名,并回应微信。 //对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败, //微信会通过一定的策略(如30分钟共8次)定期重新发起通知, //尽可能提高通知的成功率,但微信不保证通知最终能成功。 if($notify->checkSign() == FALSE){ $notify->setReturnParameter("return_code","FAIL");//返回状态码 $notify->setReturnParameter("return_msg","签名失败");//返回信息 }else{ $notify->setReturnParameter("return_code","SUCCESS");//设置返回码 } $returnXml = $notify->returnXml(); echo $returnXml; //==商户根据实际情况设置相应的处理流程,此处仅作举例======= //以log文件形式记录回调信息 $log_ = new Log_(); $log_name="./notify_url.log";//log文件路径 $log_->log_result($log_name,"【接收到的notify通知】:\n".$xml."\n"); if($notify->checkSign() == TRUE) { if ($notify->data["return_code"] == "FAIL") { //此处应该更新一下订单状态,商户自行增删操作 $log_->log_result($log_name,"【通信出错】:\n".$xml."\n"); } elseif($notify->data["result_code"] == "FAIL"){ //此处应该更新一下订单状态,商户自行增删操作 $log_->log_result($log_name,"【业务出错】:\n".$xml."\n"); } else{ //此处应该更新一下订单状态,商户自行增删操作 // 改变支付状态 mysql_connect('xxxx','xxxx','xxxx') or die('连接数据库失败!'); mysql_select_db('xxxx') or die('选择数据库失败!'); mysql_query("SET NAMES UTF8"); $orders = $notify->data["out_trade_no"];// 订单号 $sql="update wx_pay set Mark='1' where orders='".$orders."'"; if(mysql_query($sql)){ echo "设置支付状态成功----------!!!"; }else { } mysql_close(); $log_->log_result($log_name,"【支付成功】:\n".$xml."\n"); } //商户自行增加处理流程, //例如:更新订单状态 //例如:数据库操作 //例如:推送支付完成信息 }?>
以上是支付功能的主体代码,其他的可以在微信官方的demo进行参考,下面是配置文件:
最后,还需要在微信公众平台中的 开发者中心-->找到网页服务-->设置网页帐号中的:网页授权获取用户基本信息,在这里设置网页回调页面域名即可,如(www.sichang.com.cn)。
这个微信支付是基于微信官方给的demo来做的,因为微信官方给的文档和例子非常的烂,所以开发起来难度非常大。希望能给初次开发的人一点参考。