首先是登录获取openid,这个不就详细说了
首先看支付的接口
wx.requestPayment({ timeStamp: '',//时间戳 nonceStr: '',//随机字符串 package: '',//统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=*** signType: 'MD5', paySign: '',//二次签名 success (res) { }, fail (res) { }})里面的参数你只要2个参数获取不到,package和paySign,packge是通过统一下单的接口获取的(官方链接https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1),接下来就是就是获取package了
客户端先请求PHP,携带的参数body(商品信息),nonce_str(随机字符串),openid,out_trade_no(订单号),total_fee(价格),PHP如下
?php// 头文件header('Access-Control-Allow-Origin:*');header("Content-type:text/xml;charset=utf-8");// check usr and get usrIdfunction curl_post_https($url,$data){ // 模拟提交数据函数 $curl = curl_init(); // 启动一个CURL会话 curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在 curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器 curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转 curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求 curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包 curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环 curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回 $tmpInfo = curl_exec($curl); // 执行操作 if (curl_errno($curl)) { echo 'Errno'.curl_error($curl);//捕抓异常 } curl_close($curl); // 关闭CURL会话 return $tmpInfo; // 返回数据,json格式}//数组转为xml格式function arrayToXml($arr){ if(!is_array($arr) || count($arr) == 0) return ''; $xml = "xml"; foreach ($arr as $key=$val){ if ($key == 'sign'){ $xml.="".$key."".$val."/".$key.""; }else{ $xml.="".$key."![CDATA[".$val."]]/".$key.""; } } $xml.="/xml"; return $xml;}//获取ip地址function getip(){$unknown = 'unknown';if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] && strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'], $unknown) ) {$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];}else if(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], $unknown) ) {$ip = $_SERVER['REMOTE_ADDR'];}/*处理多层代理的情况或者使用正则方式:$ip = preg_match("/[d.]{7,15}/", $ip, $matches) ? $matches[0] : $unknown;*/if (false !== strpos($ip, ',')) {$ip = reset(explode(',', $ip));}return $ip;}//客户端给你传的参数$params = $_GET;$appid='wxd678efh567hg6787';//微信分配的小程序ID$body = $params["body"];//商品信息$mch_id='1230000109';//微信支付分配的商户号$nonce_str = $params["nonce_str"];$notify_url = 'http://www.weixin.qq.com/wxpay/pay.php';//异步接受微信支付的结果的回调地址$openid = $params["openid"];$out_trade_no = $params["out_trade_no"];$spbill_create_ip = getip();//ip地址$total_fee = $params["total_fee"];$trade_type = 'JSAPI';$key='dadad';//自己配的,配置路径(微信商户平台-账户设置-API安全-密钥设置)//参数名ASCII码从小到大排序$stringA = "appid=".$appid."&body=".$body."&mch_id=".$mch_id."&nonce_str=".$nonce_str."¬ify_url=".$notify_url."&openid=".$openid."&out_trade_no=".$out_trade_no."&spbill_create_ip=".$spbill_create_ip."&total_fee=".$total_fee."&trade_type=".$trade_type;//拼接key$stringSignTemp = $stringA.'&key='.$key;//md5获取签名并大写$sign = strtoupper(md5($stringSignTemp));//将请求的参数合为一个数组$i_params = array( "appid" = $appid,"body" = $body,"mch_id" = $mch_id,"nonce_str" = $nonce_str,"notify_url" = $notify_url,"openid" = $openid,"out_trade_no" = $out_trade_no,"spbill_create_ip" = $spbill_create_ip,"total_fee" = $total_fee,"trade_type" = $trade_type,"sign" = $sign);//数组转为xml(请求参数是xml)$post_xml=arrayToXml($i_params);$url="https://api.mch.weixin.qq.com/pay/unifiedorder";$resBalance = curl_post_https($url, $post_xml);//得到的数据返回给客户端echo $resBalance;exit();? 获取的格式也是xml格式,例如:
xml return_code![CDATA[SUCCESS]]/return_code return_msg![CDATA[OK]]/return_msg appid![CDATA[wx2421b1c4370ec43b]]/appid mch_id![CDATA[10000100]]/mch_id nonce_str![CDATA[IITRi8Iabbblz1Jc]]/nonce_str openid![CDATA[oUpF8uMuAJO_M2pxb1Q9zNjWeS6o]]/openid sign![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]/sign result_code![CDATA[SUCCESS]]/result_code prepay_id![CDATA[wx201411101639507cbf6ffd8b0779950874]]/prepay_id trade_type![CDATA[JSAPI]]/trade_type/xml解析获取prepay_id,然后就是获取接口所需的paySign,
客户端请求我的PHP,携带的参数nonceStr(之前得到的随机字符串,必须跟之前的一致),package(格式为package=prepay_id="wx201411101639507cbf6ffd8b0779950874"),timeStamp(时间戳),以下是PHP代码
?php// 头文件header('Access-Control-Allow-Origin:*');header("Content-type:text/html;charset=utf-8");//获取客户端传的参数$params = $_GET;$appId='wx11111111111';$nonceStr = $params["nonceStr"];$package = $params["package"];$signType = 'MD5';$timeStamp = $params["timeStamp"];$key='11111111';//拼接字符串获取签名$stringA ='appId='.$appId.'&nonceStr='.$nonceStr.'&package='.$package.'&signType='.$signType.'&timeStamp='.$timeStamp;$stringSignTemp = $stringA.'&key='.$key;$paySign = strtoupper(md5($stringSignTemp));echo $paySign;exit();? 得到paySign,就可以调用支付接口,调用支付了
如果签名失败的话,先可以使用微信提供的签名校验工具(https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=20_1),校验方式选自定义参数,然后输入参数名称以及参数值,如果得到的不一样的话就是注意参数名称,第一次签名参数名称是小写,第二次签名参数名称有部分大写,还有不能有空格,如果跟校验工具一样的话,那就只有一个原因了,key值的问题,检查key值,如果不一样改成一样的,如果一样的话,重新配置下key值就好了
然后就是微信通知你支付结果了(https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_7),第一步统一下单的回调地址那个填的PHP了,通过PHP告诉服务器,代码如下
?php//h头文件header('Access-Control-Allow-Origin:*');header("Content-type:text/html;charset=utf-8");//check usr and get usrIdfunction curl_post_https($url,$data){ // 模拟提交数据函数 $curl = curl_init(); // 启动一个CURL会话 curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在 curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器 curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转 curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求 curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包 curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环 curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回 $tmpInfo = curl_exec($curl); // 执行操作 if (curl_errno($curl)) { echo 'Errno'.curl_error($curl);//捕抓异常 } curl_close($curl); // 关闭CURL会话 return $tmpInfo; // 返回数据,json格式}//xml转为数组function xmlToArray($xml) { $arr = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $arr;}//收到腾讯发过来的结果通知得到的是xml格式$params = file_get_contents('php://input');//得到的格式转为数组$payRes = xmlToArray($params);//服务器收消息的ip地址及端口$url = 'http://12.12.12.12:12/receive';//向服务器发送得到数据,并得到服务器给我返回来的结果$ret = curl_post_https($url,json_encode($payRes));$res =json_encode($ret);//服务器说成功了,便向腾讯回复成功 if($res['staus']=='success'){ //向腾讯回复成功,格式必须这样 echo exit('xmlreturn_code![CDATA[SUCCESS]]/return_codereturn_msg![CDATA[OK]]/return_msg/xml'); }? 收到腾讯的数据,必须向腾讯回消息,否则腾讯会一直向你重复的发你没回复的订单
这样基本整个支付流程算是完成了
然后发奖的话不放心的话可以再查询下订单(https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_2)
先请求PHP,携带的参数nonce_str(随机字符串,必须跟之前的一样),out_trade_no(订单号),PHP代码如下:
?php// 头文件header('Access-Control-Allow-Origin:*');header("Content-type:text/xml;charset=utf-8");// check usr and get usrIdfunction curl_post_https($url,$data){ // 模拟提交数据函数 $curl = curl_init(); // 启动一个CURL会话 curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在 curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器 curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转 curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求 curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包 curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环 curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回 $tmpInfo = curl_exec($curl); // 执行操作 if (curl_errno($curl)) { echo 'Errno'.curl_error($curl);//捕抓异常 } curl_close($curl); // 关闭CURL会话 return $tmpInfo; // 返回数据,json格式}//数组转为xmlfunction arrayToXml($arr){ if(!is_array($arr) || count($arr) == 0) return ''; $xml = "xml"; foreach ($arr as $key=$val){ if ($key == 'sign'){ $xml.="".$key."".$val."/".$key.""; }else{ $xml.="".$key."![CDATA[".$val."]]/".$key.""; } } $xml.="/xml"; return $xml;}//客户单的参数$params = $_GET;$appid='wx1111111111111111111';$mch_id='1111111';$nonce_str = $params["nonce_str"];$out_trade_no = $params["out_trade_no"];$key='1111111111111111111111111111111';//拼接字符串得到签名$stringA = 'appid='.$appid.'&mch_id='.$mch_id.'&nonce_str='.$nonce_str.'&out_trade_no='.$out_trade_no;$stringSignTemp = $stringA.'&key='.$key;$sign = strtoupper(md5($stringSignTemp));$i_params = array( "appid" = $appid,"mch_id" = $mch_id,"nonce_str" = $nonce_str,"out_trade_no" = $out_trade_no,"sign" = $sign);//请求的参数$post_xml=arrayToXml($i_params);$url="https://api.mch.weixin.qq.com/pay/orderquery";$resBalance = curl_post_https($url, $post_xml);echo $resBalance;exit();? 得到的数据也是xml格式,return_code(状态码),result_code(业务结果),trade_state(交易状态),这些值都是SUCCESS才算成功
还有一个接口关闭订单(https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_3),一个订单如果不支付,状态一直是未支付,如果掉这个接口,这个订单状态就会变为关闭
先请求PHP,携带的参数nonce_str(随机字符串,必须跟之前的一样),out_trade_no(订单号),PHP代码如下:
?php// 头文件header('Access-Control-Allow-Origin:*');header("Content-type:text/xml;charset=utf-8");// check usr and get usrIdfunction curl_post_https($url,$data){ // 模拟提交数据函数 $curl = curl_init(); // 启动一个CURL会话 curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在 curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器 curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转 curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求 curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包 curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环 curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回 $tmpInfo = curl_exec($curl); // 执行操作 if (curl_errno($curl)) { echo 'Errno'.curl_error($curl);//捕抓异常 } curl_close($curl); // 关闭CURL会话 return $tmpInfo; // 返回数据,json格式}//数组转为xmlfunction arrayToXml($arr){ if(!is_array($arr) || count($arr) == 0) return ''; $xml = "xml"; foreach ($arr as $key=$val){ if ($key == 'sign'){ $xml.="".$key."".$val."/".$key.""; }else{ $xml.="".$key."![CDATA[".$val."]]/".$key.""; } } $xml.="/xml"; return $xml;}//得到传过来的参数$params = $_GET;$appid='wx11111111111111111';$mch_id='11111111111';$nonce_str = $params["nonce_str"];$out_trade_no = $params["out_trade_no"];$key='11111111111111111111111111111111';//拼接字符串得到签名$stringA = 'appid='.$appid.'&mch_id='.$mch_id.'&nonce_str='.$nonce_str.'&out_trade_no='.$out_trade_no;$stringSignTemp = $stringA.'&key='.$key;$sign = strtoupper(md5($stringSignTemp));$i_params = array( "appid" = $appid,"mch_id" = $mch_id,"nonce_str" = $nonce_str,"out_trade_no" = $out_trade_no,"sign" = $sign);$post_xml=arrayToXml($i_params);$url="https://api.mch.weixin.qq.com/pay/closeorder";$resBalance = curl_post_https($url, $post_xml);echo $resBalance;exit();? 得到的结果return_code(状态码)为SUCCESS时,trade_state交易状态便会成为关闭
好了,需要用的微信小程序支付大概都在这里了,看不懂的加我QQ2740045699不会的或遇到的问题可以问我哈













