小程序的支付的完整代码(php)
下面为后台代码
function pay(){ $openid = "用户的openid" $money ="需要支付的金额" ; // (!$lawyer_id) && $this-response(500,"参数错误"); (!$money) && $this-response(500,"选择金额错误!"); $orderCode = date("YmdHis"); // 订单号// 随机字符串 $str="QWERTYUIPADGHJKLZXCVNM1234567890"; $nonce = str_shuffle($str); $appid = '你的小程序appid'; $key = "你的商户秘钥"; $mch_id = "你的商户号"; $pay['appid'] = $appid; $pay['body'] = 'test'; //商品描述 $pay['mch_id'] = $mch_id; //商户号 $pay['nonce_str'] = $nonce; //随机字符串 $pay['notify_url'] = '异步接收微信支付结果通知的回调地址'; $pay['openid'] = $openid; $pay['out_trade_no'] = $orderCode; //订单号 $pay['spbill_create_ip'] = $_SERVER['SERVER_ADDR']; // 终端IP $pay['total_fee'] = 100*$money; //支付金额 $pay['trade_type'] = 'JSAPI'; //交易类型// 组建签名(不可换行 空格 否则哭吧) $stringA="appid=".$pay['appid']."&body=".$pay['body']."&mch_id=".$pay['mch_id']."&nonce_str=".$pay['nonce_str']."¬ify_url=".$pay['notify_url']."&openid=". $pay['openid']."&out_trade_no=".$pay['out_trade_no']."&spbill_create_ip=". $pay['spbill_create_ip']."&total_fee=".$pay['total_fee']."&trade_type=".$pay['trade_type']; $stringSignTemp=$stringA."&key=".$key; //注:key为商户平台设置的密钥key(这个还需要再确认一下) $sign= strtoupper(md5($stringSignTemp)); //注:MD5签名方式 $pay['sign'] = $sign; //签名// 统一下单请求 $url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; $data = $this-arrayToXml($pay);// return $data; $res = $this-wxpost($url,$data);// return $res; //返回统一下单结果// 对 统一下单返回得参数进行处理 $pay_arr = $this-xmlToArray($res); //这里是数组 if ($pay_arr['return_code'] == 'FAIL' || $pay_arr['result_code'] == 'FAIL') { echo json_encode($res);exit;// return $res; }// 调起支付数据签名字段 $timeStamp = time(); $nonce_pay = str_shuffle($str); $package = $pay_arr['prepay_id']; $signType = "MD5"; $stringPay = "appId=".$appid."&nonceStr=".$nonce_pay."&package=prepay_id=".$package."&signType=".$signType."&timeStamp=".$timeStamp."&key=".$key; $paySign = strtoupper(md5($stringPay)); $rpay['timeStamp'] = (string)$timeStamp; $rpay['nonceStr'] = $nonce_pay; $rpay['package'] = "prepay_id=".$package; $rpay['signType'] = $signType; $rpay['paySign'] = $paySign; $rpay['orders'] = $orderCode ; //订单流水号id $order echo json_encode($rpay); }异步处理函数
function notify_url(){ $receipt = $_REQUEST; if($receipt==null){ $receipt = file_get_contents("php://input"); } if($receipt == null){ $receipt = $GLOBALS['HTTP_RAW_POST_DATA']; } $post_data = $this-xmlToArray($receipt); $postSign = $post_data['sign']; unset($post_data['sign']); ksort($post_data);// 对数据进行排序 $str = $params = http_build_query($post_data);//对数组数据拼接成key=value字符串 $user_sign = strtoupper(md5($str."&key=您的商户密钥")); //再次生成签名,与$postSign比较 $ordernumber = $post_data['out_trade_no'];// 订单可以查看一下数据库是否有这个订单 if($post_data['return_code']=='SUCCESS'&& $postSign == $user_sign){ // 查询订单是否已经支付(通过订单号调取微信的查询订单的接口) //如果已经支付 更改数据库中的 支付状态 并写入日志表 file_put_contents('wxPaylog.txt',$res); if($result['data']){ // 进行更改支付成功状态 }else{ echo '微信支付失败,数据未存在该订单。'; } }else{ // 写个日志记录 file_put_contents('wxPaylog.txt',$post_data['return_code'].PHP_EOL, FILE_APPEND); echo '微信支付失败'; echo "success"; } }post 请求
function wxpost($url,$post) { //初始化 $curl = curl_init(); $header[] = "Content-type: text/xml";//定义content-type为xml //设置抓取的url curl_setopt($curl, CURLOPT_URL, $url); //设置头文件的信息作为数据流输出// curl_setopt($curl, CURLOPT_HEADER, 1); //定义请求类型 curl_setopt($curl, CURLOPT_HTTPHEADER, $header); //设置获取的信息以文件流的形式返回,而不是直接输出。 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); //设置post方式提交 curl_setopt($curl, CURLOPT_POST, 1); //设置post数据 $post_data = $post; curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data); //执行命令 $data = curl_exec($curl); //关闭URL请求 //显示获得的数据// print_r($data); if ($data) { curl_close($curl); return $data; }else{ $res = curl_error($curl); curl_close($curl); return $res; } }将数组转化为xml数据格式
function arrayToXml($arr){ $xml = "xml"; foreach ($arr as $key=$val){ if(is_array($val)){ $xml.="".$key."".$this-arrayToXml($val)."/".$key.""; }else{ $xml.="".$key."".$val."/".$key.""; } } $xml.="/xml"; return $xml; }将XML转化为json/数组
function xmlToArray($xml,$type='') { //禁止引用外部xml实体 libxml_disable_entity_loader(true); //simplexml_load_string()解析读取xml数据,然后转成json格式 $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA); if ($type == "json") { $json = json_encode($xmlstring); return $json; } $arr = json_decode(json_encode($xmlstring), true); return $arr; }小程序代码
wx.request({ url: '请求参数的地址获得下面调用支付时需要的参数', data: {'需要传入后台的参数'}, success: function (res) { var rest = res.data; console.log(rest) // 调用支付接口开始 wx.requestPayment({ timeStamp: rest.timeStamp, nonceStr: rest.nonceStr, package: rest.package, signType: rest.signType, paySign: rest.paySign, success: function(res) { console.log(res) }, fail: function(res) { console.log(res) }, complete: function(res) { console.log(res) }, }) } })













