微信小程序> 微信小程序支付详细流程以及代码以及遇到的坑-微信小程序收不收费-微信小程序花钱吗

微信小程序支付详细流程以及代码以及遇到的坑-微信小程序收不收费-微信小程序花钱吗

浏览量:1753 时间: 来源:二龙湖三胖
1.

首先是登录获取openid,这个不就详细说了

2.

首先看支付的接口

wx.requestPayment({timeStamp:'',//时间戳nonceStr:'',//随机字符串package:'',//统一下单接口返回的prepay_id参数值,提交格式如:prepay_id***signType:'MD5',paySign:'',//二次签名success(res){},fail(res){}})3.

里面的参数你只要2个参数获取不到,package和paySign,packge是通过统一下单的接口获取的(官方链接https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter9_1),接下来就是就是获取package了

4.

客户端先请求PHP,携带的参数body(商品信息),nonce_str(随机字符串),openid,out_trade_no(订单号),total_fee(价格),PHP如下

?php//头文件header('Access-Control-Allow-Origin:*');header("Content-type:text/xml;charsetutf-8");//checkusrandgetusrIdfunctioncurl_post_https($url,$data){//模拟提交数据函数$curlcurl_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);//自动设置Referercurl_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);//获取的信息以文件流的形式返回$tmpInfocurl_exec($curl);//执行操作if(curl_errno($curl)){echo'Errno'.curl_error($curl);//捕抓异常}curl_close($curl);//关闭CURL会话return$tmpInfo;//返回数据,json格式}//数组转为xml格式functionarrayToXml($arr){if(!is_array($arr)||count($arr)0)return'';$xml"xml";foreach($arras$key$val){if($key'sign'){$xml."".$key."".$val."/".$key."";}else{$xml."".$key."![CDATA[".$val."]]/".$key."";}}$xml."/xml";return$xml;}//获取ip地址functiongetip(){$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'];}elseif(isset($_SERVER['REMOTE_ADDR'])$_SERVER['REMOTE_ADDR']strcasecmp($_SERVER['REMOTE_ADDR'],$unknown)){$ip$_SERVER['REMOTE_ADDR'];}/*处理多层代理的情况或者使用正则方式:$ippreg_match("/[d.]{7,15}/",$ip,$matches)?$matches[0]:$unknown;*/if(false!strpos($ip,',')){$ipreset(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_ipgetip();//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."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;//拼接key$stringSignTemp$stringA.'key'.$key;//md5获取签名并大写$signstrtoupper(md5($stringSignTemp));//将请求的参数合为一个数组$i_paramsarray("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_xmlarrayToXml($i_params);$url"https://api.mch.weixin.qq.com/pay/unifiedorder";$resBalancecurl_post_https($url,$post_xml);//得到的数据返回给客户端echo$resBalance;exit();?5.

获取的格式也是xml格式,例如:

xmlreturn_code![CDATA[SUCCESS]]/return_codereturn_msg![CDATA[OK]]/return_msgappid![CDATA[wx2421b1c4370ec43b]]/appidmch_id![CDATA[10000100]]/mch_idnonce_str![CDATA[IITRi8Iabbblz1Jc]]/nonce_stropenid![CDATA[oUpF8uMuAJO_M2pxb1Q9zNjWeS6o]]/openidsign![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]/signresult_code![CDATA[SUCCESS]]/result_codeprepay_id![CDATA[wx201411101639507cbf6ffd8b0779950874]]/prepay_idtrade_type![CDATA[JSAPI]]/trade_type/xml6.

解析获取prepay_id,然后就是获取接口所需的paySign,

7.

客户端请求我的PHP,携带的参数nonceStr(之前得到的随机字符串,必须跟之前的一致),package(格式为packageprepay_id"wx201411101639507cbf6ffd8b0779950874"),timeStamp(时间戳),以下是PHP代码

?php//头文件header('Access-Control-Allow-Origin:*');header("Content-type:text/html;charsetutf-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;$paySignstrtoupper(md5($stringSignTemp));echo$paySign;exit();?8.

得到paySign,就可以调用支付接口,调用支付了

9.

如果签名失败的话,先可以使用微信提供的签名校验工具(https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter20_1),校验方式选自定义参数,然后输入参数名称以及参数值,如果得到的不一样的话就是注意参数名称,第一次签名参数名称是小写,第二次签名参数名称有部分大写,还有不能有空格,如果跟校验工具一样的话,那就只有一个原因了,key值的问题,检查key值,如果不一样改成一样的,如果一样的话,重新配置下key值就好了

10.

然后就是微信通知你支付结果了(https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter9_7),第一步统一下单的回调地址那个填的PHP了,通过PHP告诉服务器,代码如下

?php//h头文件header('Access-Control-Allow-Origin:*');header("Content-type:text/html;charsetutf-8");//checkusrandgetusrIdfunctioncurl_post_https($url,$data){//模拟提交数据函数$curlcurl_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);//自动设置Referercurl_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);//获取的信息以文件流的形式返回$tmpInfocurl_exec($curl);//执行操作if(curl_errno($curl)){echo'Errno'.curl_error($curl);//捕抓异常}curl_close($curl);//关闭CURL会话return$tmpInfo;//返回数据,json格式}//xml转为数组functionxmlToArray($xml){$arrjson_decode(json_encode(simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA)),true);return$arr;}//收到腾讯发过来的结果通知得到的是xml格式$paramsfile_get_contents('php://input');//得到的格式转为数组$payResxmlToArray($params);//服务器收消息的ip地址及端口$url'http://12.12.12.12:12/receive';//向服务器发送得到数据,并得到服务器给我返回来的结果$retcurl_post_https($url,json_encode($payRes));$resjson_encode($ret);//服务器说成功了,便向腾讯回复成功if($res['staus']'success'){//向腾讯回复成功,格式必须这样echoexit('xmlreturn_code![CDATA[SUCCESS]]/return_codereturn_msg![CDATA[OK]]/return_msg/xml');}?11.

收到腾讯的数据,必须向腾讯回消息,否则腾讯会一直向你重复的发你没回复的订单

12.

这样基本整个支付流程算是完成了

13.

然后发奖的话不放心的话可以再查询下订单(https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter9_2)

14.

先请求PHP,携带的参数nonce_str(随机字符串,必须跟之前的一样),out_trade_no(订单号),PHP代码如下:

?php//头文件header('Access-Control-Allow-Origin:*');header("Content-type:text/xml;charsetutf-8");//checkusrandgetusrIdfunctioncurl_post_https($url,$data){//模拟提交数据函数$curlcurl_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);//自动设置Referercurl_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);//获取的信息以文件流的形式返回$tmpInfocurl_exec($curl);//执行操作if(curl_errno($curl)){echo'Errno'.curl_error($curl);//捕抓异常}curl_close($curl);//关闭CURL会话return$tmpInfo;//返回数据,json格式}//数组转为xmlfunctionarrayToXml($arr){if(!is_array($arr)||count($arr)0)return'';$xml"xml";foreach($arras$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;$signstrtoupper(md5($stringSignTemp));$i_paramsarray("appid"$appid,"mch_id"$mch_id,"nonce_str"$nonce_str,"out_trade_no"$out_trade_no,"sign"$sign);//请求的参数$post_xmlarrayToXml($i_params);$url"https://api.mch.weixin.qq.com/pay/orderquery";$resBalancecurl_post_https($url,$post_xml);echo$resBalance;exit();?15.

得到的数据也是xml格式,return_code(状态码),result_code(业务结果),trade_state(交易状态),这些值都是SUCCESS才算成功

16.

还有一个接口关闭订单(https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter9_3),一个订单如果不支付,状态一直是未支付,如果掉这个接口,这个订单状态就会变为关闭

17.

先请求PHP,携带的参数nonce_str(随机字符串,必须跟之前的一样),out_trade_no(订单号),PHP代码如下:

?php//头文件header('Access-Control-Allow-Origin:*');header("Content-type:text/xml;charsetutf-8");//checkusrandgetusrIdfunctioncurl_post_https($url,$data){//模拟提交数据函数$curlcurl_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);//自动设置Referercurl_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);//获取的信息以文件流的形式返回$tmpInfocurl_exec($curl);//执行操作if(curl_errno($curl)){echo'Errno'.curl_error($curl);//捕抓异常}curl_close($curl);//关闭CURL会话return$tmpInfo;//返回数据,json格式}//数组转为xmlfunctionarrayToXml($arr){if(!is_array($arr)||count($arr)0)return'';$xml"xml";foreach($arras$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;$signstrtoupper(md5($stringSignTemp));$i_paramsarray("appid"$appid,"mch_id"$mch_id,"nonce_str"$nonce_str,"out_trade_no"$out_trade_no,"sign"$sign);$post_xmlarrayToXml($i_params);$url"https://api.mch.weixin.qq.com/pay/closeorder";$resBalancecurl_post_https($url,$post_xml);echo$resBalance;exit();?18.

得到的结果return_code(状态码)为SUCCESS时,trade_state交易状态便会成为关闭

19.

好了,需要用的微信小程序支付大概都在这里了,看不懂的加我QQ2740045699不会的或遇到的问题可以问我哈

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

最新资讯

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎