1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 一个页面搞定原生态微信支付(扫码支付)

一个页面搞定原生态微信支付(扫码支付)

时间:2023-10-17 17:16:05

相关推荐

一个页面搞定原生态微信支付(扫码支付)

支付页面生成付款二维码

一个PHP页面搞定微信支付,给大家一个思路,方便理解。知道原理了可以用到各种框架里,变成函数或者扩展类。

<?phpheader('Content-type:text/html; Charset=utf-8');$mchid = 'xxxx';//微信支付商户号 PartnerID 通过微信支付商户资料审核后邮件发送$appid = 'xxxx'; //公众号APPID 通过微信支付商户资料审核后邮件发送$apiKey = 'xxxx'; //https://pay. 帐户设置-安全设置-API安全-API密钥-设置API密钥$wxPay = new WxpayService($mchid,$appid,$apiKey);$outTradeNo = uniqid();//你自己的商品订单号$payAmount = 0.01;//付款金额,单位:元$orderName = '支付测试'; //订单标题$notifyUrl = '/wx/notify.php';//付款成功后的回调地址(不要有问号)$payTime = time();//付款时间$arr = $wxPay->createJsBizPackage($payAmount,$outTradeNo,$orderName,$notifyUrl,$payTime);//生成二维码$url = 'https://my./user/a/wvideo/getQRCode.do?width=300&height=300&text='.$arr['code_url'];echo "<img src='{$url}' style='width:300px;'><br>";echo '二维码内容:'.$arr['code_url'];class WxpayService{protected $mchid;protected $appid;protected $apiKey;public function __construct($mchid, $appid, $key){$this->mchid = $mchid;$this->appid = $appid;$this->apiKey = $key;}/*** 发起订单* @param float $totalFee 收款总费用 单位元* @param string $outTradeNo 唯一的订单号* @param string $orderName 订单名称* @param string $notifyUrl 支付结果通知url 不要有问号* @param string $timestamp 订单发起时间* @return array*/public function createJsBizPackage($totalFee, $outTradeNo, $orderName, $notifyUrl, $timestamp){$config = array('mch_id' => $this->mchid,'appid' => $this->appid,'key' => $this->apiKey,);//$orderName = iconv('GBK','UTF-8',$orderName);$unified = array('appid' => $config['appid'],'attach' => 'pay', //商家数据包,原样返回,如果填写中文,请注意转换为utf-8'body' => $orderName,'mch_id' => $config['mch_id'],'nonce_str' => self::createNonceStr(),'notify_url' => $notifyUrl,'out_trade_no' => $outTradeNo,'spbill_create_ip' => '127.0.0.1','total_fee' => intval($totalFee * 100), //单位 转为分'trade_type' => 'NATIVE',);$unified['sign'] = self::getSign($unified, $config['key']);$responseXml = self::curlPost('https://api.mch./pay/unifiedorder', self::arrayToXml($unified));//禁止引用外部xml实体libxml_disable_entity_loader(true); $unifiedOrder = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA);if ($unifiedOrder === false) {die('parse xml error');}if ($unifiedOrder->return_code != 'SUCCESS') {die($unifiedOrder->return_msg);}if ($unifiedOrder->result_code != 'SUCCESS') {die($unifiedOrder->err_code);}$codeUrl = (array)($unifiedOrder->code_url);if(!$codeUrl[0]) exit('get code_url error');$arr = array("appId" => $config['appid'],"timeStamp" => $timestamp,"nonceStr" => self::createNonceStr(),"package" => "prepay_id=" . $unifiedOrder->prepay_id,"signType" => 'MD5',"code_url" => $codeUrl[0],);$arr['paySign'] = self::getSign($arr, $config['key']);return $arr;}public function notify(){$config = array('mch_id' => $this->mchid,'appid' => $this->appid,'key' => $this->apiKey,);$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);if ($postObj === false) {die('parse xml error');}if ($postObj->return_code != 'SUCCESS') {die($postObj->return_msg);}if ($postObj->result_code != 'SUCCESS') {die($postObj->err_code);}$arr = (array)$postObj;unset($arr['sign']);if (self::getSign($arr, $config['key']) == $postObj->sign) {echo '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';return $postObj;}}/*** curl get** @param string $url* @param array $options* @return mixed*/public static function curlGet($url = '', $options = array()){$ch = curl_init($url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_TIMEOUT, 30);if (!empty($options)) {curl_setopt_array($ch, $options);}//https请求 不验证证书和hostcurl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);$data = curl_exec($ch);curl_close($ch);return $data;}public static function curlPost($url = '', $postData = '', $options = array()){if (is_array($postData)) {$postData = http_build_query($postData);}$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数if (!empty($options)) {curl_setopt_array($ch, $options);}//https请求 不验证证书和hostcurl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);$data = curl_exec($ch);curl_close($ch);return $data;}public static function createNonceStr($length = 16){$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';$str = '';for ($i = 0; $i < $length; $i++) {$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);}return $str;}public static function arrayToXml($arr){$xml = "<xml>";foreach ($arr as $key => $val) {if (is_numeric($val)) {$xml .= "<" . $key . ">" . $val . "</" . $key . ">";} else$xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";}$xml .= "</xml>";return $xml;}/*** 获取签名*/public static function getSign($params, $key){ksort($params, SORT_STRING);$unSignParaString = self::formatQueryParaMap($params, false);$signStr = strtoupper(md5($unSignParaString . "&key=" . $key));return $signStr;}protected static function formatQueryParaMap($paraMap, $urlEncode = false){$buff = "";ksort($paraMap);foreach ($paraMap as $k => $v) {if (null != $v && "null" != $v) {if ($urlEncode) {$v = urlencode($v);}$buff .= $k . "=" . $v . "&";}}$reqPar = '';if (strlen($buff) > 0) {$reqPar = substr($buff, 0, strlen($buff) - 1);}return $reqPar;}}

说明:理解了可以把生成的付款二维码通过JSON返回,然后页面AJAX调用,实现无刷新弹出付款二维码,这样做的用户体验会更好。如果你不知道怎么弄,可以参考下前面JQUERY弹出层登录功能,看看应该不难做。

回调页面代码

<?php/*** 异步回调通知* 说明:需要在支付文件中(如native.php或者jsapi.php)的填写回调地址。例如:/wx/notify.php* 付款成功后,微信服务器会将付款结果通知到该页面*/header('Content-type:text/html; Charset=utf-8');$mchid = 'xxxxx';//微信支付商户号 PartnerID 通过微信支付商户资料审核后邮件发送$appid = 'xxxxx'; //公众号APPID 通过微信支付商户资料审核后邮件发送$apiKey = 'xxxxx'; //https://pay. 帐户设置-安全设置-API安全-API密钥-设置API密钥$wxPay = new WxpayService($mchid,$appid,$apiKey);$result = $wxPay->notify();if($result){//完成你的逻辑//例如连接数据库,获取付款金额$result['cash_fee'],获取订单号$result['out_trade_no'],修改数据库中的订单状态等;//现金支付金额:$result['cash_fee']//订单金额:$result['total_fee']//商户订单号:$result['out_trade_no']//付款银行:$result['bank_type']//货币种类:$result['fee_type']//是否关注公众账号:$result['is_subscribe']//用户标识:$result['openid']//业务结果:$result['result_code'] SUCCESS/FAIL//支付完成时间:$result['time_end'] 格式为yyyyMMddHHmmss//具体详细请看微信文档:https://pay./wiki/doc/api/jsapi.php?chapter=9_7&index=8}else{echo 'pay error';}class WxpayService{protected $mchid;protected $appid;protected $apiKey;public function __construct($mchid, $appid, $key){$this->mchid = $mchid;$this->appid = $appid;$this->apiKey = $key;}public function notify(){$config = array('mch_id' => $this->mchid,'appid' => $this->appid,'key' => $this->apiKey,);$postStr = file_get_contents('php://input');//禁止引用外部xml实体libxml_disable_entity_loader(true); $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);if ($postObj === false) {die('parse xml error');}if ($postObj->return_code != 'SUCCESS') {die($postObj->return_msg);}if ($postObj->result_code != 'SUCCESS') {die($postObj->err_code);}$arr = (array)$postObj;unset($arr['sign']);if (self::getSign($arr, $config['key']) == $postObj->sign) {echo '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';return $arr;}}/*** 获取签名*/public static function getSign($params, $key){ksort($params, SORT_STRING);$unSignParaString = self::formatQueryParaMap($params, false);$signStr = strtoupper(md5($unSignParaString . "&key=" . $key));return $signStr;}protected static function formatQueryParaMap($paraMap, $urlEncode = false){$buff = "";ksort($paraMap);foreach ($paraMap as $k => $v) {if (null != $v && "null" != $v) {if ($urlEncode) {$v = urlencode($v);}$buff .= $k . "=" . $v . "&";}}$reqPar = '';if (strlen($buff) > 0) {$reqPar = substr($buff, 0, strlen($buff) - 1);}return $reqPar;}}

wxpayservice这个类其实可以公用的,大家自己整理下吧,相信应该不难。之所以分开是为了让大家看清楚每个功能主要用到类的哪些方法。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。