失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 详解微信支付开发之刷卡支付实例

详解微信支付开发之刷卡支付实例

时间:2023-11-06 14:17:07

相关推荐

详解微信支付开发之刷卡支付实例

微信小程序|微信开发

支付开发,刷卡支付

微信小程序-微信开发

本文介绍微信支付下的刷卡支付的开发过程。微信刷卡支付是指用户打开微信钱包的刷卡的界面,商户扫码后提交完成支付的支付过程。

贝壳粉网站源码,Vscode默认打开位置,.ova导入ubuntu,tomcat部署多个服务,agent 爬虫,php 微信 xml,南阳seo建设公司,简洁网站导航页源码,模板之家dwlzw

wip源码,ubuntu新手怎么用,价格爬虫是什么,备份php,浙江优化seolzw

A、刷卡支付API

卡盟免费源码,y7000ubuntu,tomcat服务启动乱码,处理png爬虫,php流量监控脚本,法库常规抖音seo优化要多少钱lzw

接口地址

api.mch./pay/micropay

是否需要证书

不需要。

输入参数

名称 变量名 必填 类型 示例值 描述

举例如下:

wx2421b1c4370ec43b 订单额外描述 120269300684844649 刷卡支付测试 100010000100 8aaee146b1dee7cec9100add9b96cbe2 1415757673 14.17.22.521 C29DB7DB1FD4136B84AE35604756362C

注:参数值用XML转义即可,CDATA标签用于说明数据不被XML解析器解析。

返回结果

名称 变量名 必填 类型 示例值 描述

当return_code为SUCCESS的时候,还会包括以下字段:

名称 变量名 必填 类型 示例值 描述

当return_code 和result_code都为SUCCESS的时,还会包括以下字段:

名称 变量名 必填 类型 示例值 描述

举例如下:

<![CDATA[SUCCESS]]> <![CDATA[OK]]> <![CDATA[wx2421b1c4370ec43b]]> <![CDATA[10000100]]> <![CDATA[1000]]> <![CDATA[GOp3TRyMXzbMlkun]]> <![CDATA[D6C76CB785F07992CDE05494BB7DF7FD]]> <![CDATA[SUCCESS]]> <![CDATA[oUpF8uN95-Ptaags6E_roPHg7AG0]]> <![CDATA[Y]]> <![CDATA[MICROPAY]]> <![CDATA[CCB_DEBIT]]> 1 0 <![CDATA[CNY]]> <![CDATA[100845074011110005820873]]> <![CDATA[1415757673]]> <![CDATA[订单额外描述]]> <![CDATA[1111170043]]>

B、刷卡支付类实现

在微信支付原来的微信支付类文件中,仿照统一支付类的方式,添加刷卡支付类如下:

/** * 刷卡支付接口类 */class MicroPay_pub extends Wxpay_client_pub{ function __construct(){ //设置接口链接 $this->url = "https://api.mch./pay/micropay"; //设置curl超时时间 $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT; } /*** 生成接口参数xml*/ function createXml() { try { //检测必填参数 if($this->parameters["out_trade_no"] == null){throw new SDKRuntimeException("缺少统一支付接口必填参数out_trade_no!"."

"); }elseif($this->parameters["body"] == null){throw new SDKRuntimeException("缺少统一支付接口必填参数body!"."

"); }elseif ($this->parameters["total_fee"] == null ) {throw new SDKRuntimeException("缺少统一支付接口必填参数total_fee!"."

"); }elseif ($this->parameters["auth_code"] == null) {throw new SDKRuntimeException("缺少统一支付接口必填参数auth_code!"."

"); }$this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID$this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号$this->parameters["spbill_create_ip"] = $_SERVER[REMOTE_ADDR];//终端ip$this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串 $this->parameters["sign"] = $this->getSign($this->parameters);//签名 // var_dump($this->parameters); return $this->arrayToXml($this->parameters); }catch (SDKRuntimeException $e) { die($e->errorMessage()); } }}

原有的基础类和请求类也列出如下:

/** * 所有接口的基类 */class Common_util_pub{ function __construct() { } function trimString($value) { $ret = null; if (null != $value) { $ret = $value; if (strlen($ret) == 0) {$ret = null; } } return $ret; } /***作用:产生随机字符串,不长于32位*/ public function createNoncestr( $length = 32 ){ $chars = "abcdefghijklmnopqrstuvwxyz0123456789";$str =""; for ( $i = 0; $i $v) { if($urlencode) {$v = urlencode($v); } //$buff .= strtolower($k) . "=" . $v . "&"; $buff .= $k . "=" . $v . "&"; } $reqPar; if (strlen($buff) > 0) { $reqPar = substr($buff, 0, strlen($buff)-1); } return $reqPar; } /***作用:生成签名*/ public function getSign($Obj) { foreach ($Obj as $k => $v) { $Parameters[$k] = $v; } //签名步骤一:按字典序排序参数 ksort($Parameters); $String = $this->formatBizQueryParaMap($Parameters, false); //echo 【string1】.$String.\; //签名步骤二:在string后加入KEY $String = $String."&key=".WxPayConf_pub::KEY; //echo "【string2】".$String.""; //签名步骤三:MD5加密 $String = md5($String); //echo "【string3】 ".$String.""; //签名步骤四:所有字符转为大写 $result_ = strtoupper($String); //echo "【result】 ".$result_.""; return $result_; } /***作用:array转xml*/ function arrayToXml($arr) { $xml = ""; foreach ($arr as $key=>$val) { if (is_numeric($val)) { $xml.="".$val.""; } else $xml.="<![CDATA[".$val."]]>";} $xml.=""; return $xml;} /***作用:将xml转为array*/ public function xmlToArray($xml) {//将XML转为array$array_data = json_decode(json_encode(simplexml_load_string($xml, SimpleXMLElement, LIBXML_NOCDATA)), true);return $array_data; } /***作用:以post方式提交xml到对应的接口url*/ public function postXmlCurl($xml,$url,$second=30) {//初始化curl $ch = curl_init(); //设置超时 curl_setopt($ch, CURLOP_TIMEOUT, $second); //这里设置代理,如果有的话 //curl_setopt($ch,CURLOPT_PROXY, 8.8.8.8); //curl_setopt($ch,CURLOPT_PROXYPORT, 8080); curl_setopt($ch,CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE); //设置header curl_setopt($ch, CURLOPT_HEADER, FALSE); //要求结果为字符串且输出到屏幕上 curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //post提交方式 curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); //运行curl $data = curl_exec($ch); curl_close($ch); //返回结果 if($data) { curl_close($ch); return $data; } else { $error = curl_errno($ch); echo "curl出错,错误码:$error"."

"; echo "错误原因查询"; curl_close($ch); return false; } } /***作用:使用证书,以post方式提交xml到对应的接口url*/ function postXmlSSLCurl($xml,$url,$second=30) { $ch = curl_init(); //超时时间 curl_setopt($ch,CURLOPT_TIMEOUT,$second); //这里设置代理,如果有的话 //curl_setopt($ch,CURLOPT_PROXY, 8.8.8.8); //curl_setopt($ch,CURLOPT_PROXYPORT, 8080); curl_setopt($ch,CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE); //设置header curl_setopt($ch,CURLOPT_HEADER,FALSE); //要求结果为字符串且输出到屏幕上 curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE); //设置证书 //使用证书:cert 与 key 分别属于两个.pem文件 //默认格式为PEM,可以注释 curl_setopt($ch,CURLOPT_SSLCERTTYPE,PEM); curl_setopt($ch,CURLOPT_SSLCERT, dirname(__FILE__).WxPayConf_pub::SSLCERT_PATH); //默认格式为PEM,可以注释 curl_setopt($ch,CURLOPT_SSLKEYTYPE,PEM); curl_setopt($ch,CURLOPT_SSLKEY, dirname(__FILE__).WxPayConf_pub::SSLKEY_PATH); //post提交方式 curl_setopt($ch,CURLOPT_POST, true); curl_setopt($ch,CURLOPT_POSTFIELDS,$xml); $data = curl_exec($ch); //返回结果 if($data){ curl_close($ch); return $data; } else { $error = curl_errno($ch); echo "curl出错,错误码:$error"."

"; echo "错误原因查询"; curl_close($ch); return false; } } /***作用:打印数组*/ function printErr($wording=\,$err=\) { print_r(

); echo $wording.""; var_dump($err); print_r(

);

}

}

/**

* 请求型接口的基类

*/

class Wxpay_client_pub extends Common_util_pub

{

var $parameters;//请求参数,类型为关联数组

public $response;//微信返回的响应

public $result;//返回参数,类型为关联数组

var $url;//接口链接

var $curl_timeout;//curl超时时间

/**

*作用:设置请求参数

*/

function setParameter($parameter, $parameterValue)

{

$this->parameters[$this->trimString($parameter)] = $this->trimString($parameterValue);

}

/**

*作用:设置标配的请求参数,生成签名,生成接口参数xml

*/

function createXml()

{

$this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID

$this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号

$this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串

$this->parameters["sign"] = $this->getSign($this->parameters);//签名

return $this->arrayToXml($this->parameters);

}

/**

*作用:post请求xml

*/

function postXml()

{

$xml = $this->createXml();

$this->response = $this->postXmlCurl($xml,$this->url,$this->curl_timeout);

return $this->response;

}

/**

*作用:使用证书post请求xml

*/

function postXmlSSL()

{

$xml = $this->createXml();

$this->response = $this->postXmlSSLCurl($xml,$this->url,$this->curl_timeout);

return $this->response;

}

/**

*作用:获取结果,默认不使用证书

*/

function getResult()

{

$this->postXml();

$this->result = $this->xmlToArray($this->response);

return $this->result;

}

}C、发起支付

在程序中,获得用户的授权码,并填入到$authcode参数中。授权码就是条码上的那一串18位纯数字,以10、11、12、13、14、15开头

其他参数则自动生成或者手动输入指定。

调用函数如下所示

//全局引入微信支付类 Vendor(Wxpay.WxPayPubHelper.WxPayPubHelper); //使用统一支付接口 $microPay = new \MicroPay_pub(); //设置统一支付接口参数 $microPay->setParameter("body","方倍商户刷卡支付");//商品描述 $microPay->setParameter("out_trade_no", "$out_trade_no");//商户订单号 $microPay->setParameter("total_fee", $total_fee);//总金额$microPay->setParameter("auth_code", $authcode);//授权码 //获取统一支付接口结果 $microPayResult = $microPay->getResult(); //3. 异常判断 if (!isset($microPayResult["result_code"]) || ($microPayResult["result_code"] == "FAIL")) { $this->resRpcError(isset($microPayResult[ esult_code]) ? $microPayResult[err_code_des] : $microPayResult[ eturn_msg], "21000"); }

【相关推荐】

1. 微信公众号平台源码下载

2. 分享微信公众号开发刷卡支付的实例教学

3. 微信开发之微信支付

4. 详解微信小程序支付功能开发错误总结

如果觉得《详解微信支付开发之刷卡支付实例》对你有帮助,请点赞、收藏,并留下你的观点哦!

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