首页
时事
归档
壁纸
更多
留言
关于
邻里
Search
1
使用必应Bing每日图片做网站背景(自动)
2,986 阅读
2
vue的输入值校验规则整理
1,660 阅读
3
VUE `ERR_CONNECTION_TIMED_OUT`的解决办法
1,628 阅读
4
好站推荐-https://wangchujiang.com/linux-command/
1,597 阅读
5
微信支付开发前准备(小程序、公众号、App、H5)
1,581 阅读
文章
图说
代码
吐槽
登录
Search
标签搜索
Linux
laravel
windows
TYPO3
php
shell脚本
git
微信
好站
vue
第三方登录
centos
linxu
centos7
thinkPHP
微信支付
api
MySQL
桌面
必应首图
Beer
累计撰写
114
篇文章
累计收到
22
条评论
首页
栏目
文章
图说
代码
吐槽
页面
时事
归档
壁纸
留言
关于
邻里
搜索到
3
篇与
微信支付
的结果
2021-01-28
微信支付开发前准备(小程序、公众号、App、H5)
前言本人是一个PHPer,所以本文仅针对PHP开发人员,后面会更新本系列的其他微信公众号相关的内容,所以提前说明方向,以免误导了您。不过语言都是相通的,其他语言的开发也可以简单看看,了解一下,开发前期准备步骤都是一样的;话不多说,看正文1、注册一个服务号,并认证通过微信公众平台地址:https://mp.weixin.qq.com ,开发者可以使用公司邮箱,根据微信的官方引导注册 服务号,一定要是公司的邮箱,以后用经常用到的;注册完成之后,进行微信认证,路径:点击左上方头像 -> 选择认证详情 -> 在出来的界面按要求申请认证即可。2、开通微信支付功能认证通过以后,可在微信公众平台申请开通微信支付,路径:平台首页 -> 点击左侧微信支付 -> 点击支付申请 -> 根据官方引导一步步申请即可。开通微信支付需要注册登陆 微信商户平台,微信支付相关的信息都需要在这个平台上进行操作。注册登陆商户平台,进入账户中心 -> 支付申请 -> 按要求填写即可;PS:一定要注意服务号和商户平台必须是一个账户主体,也就是认证的公司需要一致,否则不是同一个商户。3、添加服务号和商户平台的用户管理权限通常开通微信公众平台和商户平台的人都是管理员,也就是你的老大等人员,我们开发者需要登陆使用功能时也不会使用管理员,所以需要添加自己微信号的权限;微信公众平台的权限叫做 运营者微信号,在公众平台的左侧 -> 人员设置中添加,需要管理员为我们绑定一个长期的运营者账号;商户平台地址:https://pay.weixin.qq.com微信商户平台的权限叫做 员工账号,在商户平台 -> 账户中心 -> 左侧员工账号管理 -> 选择某个角色(通常是管理员)-> 新增账号 -> 按要求填写之后即可;如果添加后开发者还是没有需要的相关权限,可以在角色右上方 配置权限 中授权修改。4、配置公众号 JS接口安全域名 和 网页授权域名微信强制规定,如果要使用公众号支付、H5支付、小程序支付等产品时,必须获取到用户的openid,也就是用户唯一标识,如果获取呢?公众号支付需要网页授权,而网页授权就必须配置 JS接口安全域名 和 网页授权域名这两个域名,小程序支付也一致;不同点是,公众号支付的域名可以是http/https,而小程序则必须是https;配置路径:公众平台 -> 左侧公众号设置 -> 功能设置 -> JS接口安全域名/网页授权域名需要下载微信的安全配置文件,放到咋们的服务器上,根据 授权的域名+认证文件 可以访问后即可配置完成;需要注意的是,每次修改认证域名都会再次重新认证域名,所以认证以后文件请不要轻易删除。PS:设置IP白名单,在IP白名单内的IP来源,获取access_token接口才可调用成功。路径:公众平台首页 -> 基本配置5、在商户平台开通相应的支付产品功能登陆微信商户平台,进入产品中心,可以开通需要的支付产品,如公众号支付、扫码支付、刷卡支付、H5支付;需要注意的是,在商户平台上小程序也属于公众号支付,不需要单独开通。PS:如果公司需要做提现等功能,需要直接向用户付款,那么需要开通 企业付款到零钱 产品功能,此功能主要用来解决合理的商户对用户付款需求,最终金额会直接到用户微信零钱中;如果公司需要向用户银行卡付款,则需要开通 企业付款到个人银行卡 产品功能,该功能提供由商户直接付钱至指定银行卡账户的能力,主要用来解决合理的商户对用户付款需求。如果公司提现是用公众号为用户发放红包,那么需要开通 现金红包 产品功能,企业向指定用户发放现金红包,红包会显示在服务号中,需要用户领取,用户在客户端领取到红包之后,所得金额进入微信钱包,可用于转账、支付或提取到银行卡。现金红包PS:开通条件:入账方式为即时入账至商户号,结算周期为T+1的商户需满足以下两个条件:1.入驻满90天,2.连续正常交易30天。其余结算周期的商户无限制6、在商户平台设置支付的相关ip授权这里以公众号支付为例,开通公众号支付后,这是还不能进行开发,我们需要拿到商户的几个重要信息:APP_ID(公众平台获取):公众号/小程序开发者ID(AppID) -> 公众平台首页 -> 基本配置APP_SECRET(公众平台获取):开发者密码(AppSecret) -> 公众平台首页 -> 基本配置MCH_ID(商户平台获取):商户号 -> 商户平台首页 -> 账户中心 -> 账户信息API_KEY(商户平台获取):API密钥 -> 商户平台首页 -> 账户中心 -> API安全APICLIENT_CERT(商户平台获取):安全证书路径 -> 商户平台首页 -> 账户中心 -> API安全PS:如果需要将小程序和公众号联通,需要在 公众平台首页 -> 基本配置 中绑定同一个微信开放平台帐号
2021年01月28日
1,581 阅读
0 评论
0 点赞
2019-03-13
微信支付——企业付款到银行卡,零钱,查询订单
最近,业务上有个需求,用到了微信的企业付款到银行卡这个接口。网上找了些资料,总之是坑比较多吧,但是这也算是微信文档的通病了。为此,我整理了一下企业付款到银行卡的使用类。商户可以将商户号余额付款至指定的收款银行账户。通过指定收款银行账户户名、卡号,以及收款银行信息即可实现付款。文档地址:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_1&index=1使用条件商户号(或同主体其他非服务商商户号)已入驻90日商户号(或同主体其他非服务商商户号)有30天连续正常交易登录微信支付商户平台-产品中心,开通企业付款。功能说明企业付款至银行卡只支持新资金流类型账户目前企业付款到银行卡支持17家银行,更多银行逐步开放中付款到账实效为1-3日,最快次日到账每笔按付款金额收取手续费,按金额0.1%收取,最低1元,最高25元,如果商户开通了运营账户,手续费和付款的金额都从运营账户出。如果没有开通,则都从基本户出。每个商户号每天可以出款100万,单商户给同一银行卡付款每天限额5万发票:在账户中心-发票信息页面申请开票的商户会按月收到发票(已申请的无需重复申请)。企业付款到银行卡发票与交易手续费发票为拆分单独开具。代码<?php namespace Jykj\\Balance\\Weixin; /*************************************************************** * 企业付款到零钱、企业付款到银行卡、查询企业付款;证书的加密,解密。有问题邮件联系我 * Copyright notice * * (c) Wang Hongbin <wanghongbin@ngoos.org>, 极益科技 * * @Author: Wang Hongbin * @Email: wanghongbin@ngoos.org * @Date: 2018-06-13 11:29:39 * @Last Modified by: Wang Hongbin * @Last Modified time: 2018-06-13 16:50:46 ***************************************************************/ class WxPubApi { private $params; private $paths = ""; // 证书存放路径 private $cpath = ""; // 公钥路径 private $kpath = ""; // 私钥路径 const KEY = ''1111111111111111111111111111qq''; // 32位 const MCHID = ''1111111111''; // 商户号 const APPID = ''wxdwdq1312312qweqw''; const SECRET = ''asdddddddddddddddddddddddddddd''; const PAYURL = ''https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers''; const SEPAYURL = "https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo"; const BANKPAY = "https://api.mch.weixin.qq.com/mmpaysptrans/pay_bank"; const PKURL = "https://fraud.mch.weixin.qq.com/risk/getpublickey"; public function __construct(){ $this->paths = dirname(__FILE__).''/cert/''; $this->cpath = dirname(__FILE__).''/cert/apiclient_cert.pem''; $this->kpath = dirname(__FILE__).''/cert/apiclient_key.pem''; } /** * 付款到零钱 * @param [type] $data [description] * @return [type] [description] */ public function createComPay($data){ //构建原始数据 $this->params = [ ''mch_appid'' => self::APPID,//APPid, ''mchid'' => self::MCHID,//商户号, ''nonce_str'' => strtoupper(md5(time())), //随机字符串 ''partner_trade_no'' => $data[''trade_no''], //商户订单号 ''openid'' => $data[''openid''], //用户openid ''check_name'' => ''NO_CHECK'',//校验用户姓名选项 NO_CHECK:不校验真实姓名 FORCE_CHECK:强校验真实姓名 //''re_user_name'' => '''',//收款用户姓名 如果check_name设置为FORCE_CHECK,则必填用户真实姓名 ''amount'' => $data[''price''],//金额 单位分 ''desc'' => $data[''desc''],//付款描述 ''spbill_create_ip'' => $_SERVER[''SERVER_ADDR''],//调用接口机器的ip地址 ]; //将数据发送到接口地址 return $this->SendData(self::PAYURL); } /** * 转账到银行卡 * @param [type] $data [description] * @return [type] [description] */ public function createBankPay($data){ $this->params = [ ''mch_id'' => self::MCHID,//商户号 ''partner_trade_no'' => date(''YmdHis''),//商户付款单号 ''nonce_str'' => strtoupper(md5(time())), //随机串 ''enc_bank_no'' => $data[''enc_bank_no''],//收款方银行卡号RSA加密 ''enc_true_name'' => $data[''enc_true_name''],//收款方姓名RSA加密 ''bank_code'' => $data[''bank_code''],//收款方开户行 ''amount'' => $data[''amount''],//付款金额 ]; //将数据发送到接口地址 return $this->SendData(self::BANKPAY); } /** * 查询订单 * @param [type] $oid [description] * @return [type] [description] */ public function searchPayByOrder($oid){ $this->params = [ ''nonce_str'' => md5(time()),//随机串 ''partner_trade_no'' => $oid, //商户订单号 ''mch_id'' => self::MCHID,//商户号 ''appid'' => self::APPID //APPID ]; //将数据发送到接口地址 return $this->SendData(self::SEPAYURL); } /** * 获取公钥 * @return [type] [description] */ public function getRsaPuyKey(){ $this->params = [ ''mch_id'' => self::MCHID,//商户ID ''nonce_str'' => strtoupper(MD5(time())), ''sign_type'' => ''MD5'' ]; //将数据发送到接口地址 $pubkey = $this->SendData(self::PKURL); file_put_contents($this->paths.''pubkey.pem'', $pubkey[''pub_key'']); return $pubkey; } public function getSign($params=array()){ //去除空值 $params = array_filter($params); if(isset($params[''sign''])) unset($params[''sign'']); //按照键名字典排序 ksort($params); //生成url格式的字符串 $str = $this->arrToUrl($params).''&key=''.self::KEY; $params[''sign''] = strtoupper(md5($str)); return $params; } public function arrToUrl($arr){ return urldecode(http_build_query($arr)); } /** * 获取随机数 * @param integer $length [description] * @return [type] [description] */ public function getRandomKeys($length=30) { $str = ''ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz''; $key = null; for ($i = 0; $i < $length; $i++) { $key .= $pattern{mt_rand(0, 30)}; //生成php随机数 } return $key; } //数组转xml public function ArrToXml($arr){ if(!is_array($arr) || count($arr) == 0) return ''''; $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; } //Xml转数组 public function XmlToArr($xml){ if($xml == '''') return ''''; libxml_disable_entity_loader(true); $arr = json_decode(json_encode(simplexml_load_string($xml, ''SimpleXMLElement'', LIBXML_NOCDATA)), true); return $arr; } /** * 下面是写死的东西不需要改变 //通用发送CURL接口 * @param [type] $data [description] * @param [type] $url [description] */ public function SendCurl($data,$url){ $ch = curl_init(); //接口地址 $MENU_URL = $url; curl_setopt($ch,CURLOPT_URL, $MENU_URL); curl_setopt($ch,CURLOPT_CUSTOMREQUEST,"POST"); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST, FALSE); //证书地址,微信支付下面 curl_setopt($ch,CURLOPT_SSLCERT,$this->cpath); curl_setopt($ch,CURLOPT_SSLKEY,$this->kpath); // curl_setopt($ch, CURLOPT_USERAGENT, ''Mozilla/5.0 (compatible; MSIE 5.01; // Windows NT 5.0)''); //curl_setopt ( $ch, CURLOPT_FOLLOWLOCATION, 1 ); curl_setopt($ch,CURLOPT_AUTOREFERER,1); curl_setopt($ch,CURLOPT_POSTFIELDS, $data); curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); $info = curl_exec($ch); if (curl_errno($ch)) { //echo ''Errno'' . curl_error ( $ch ); exit(''CURL执行失败''); } curl_close($ch); return $info; } /** * 发送数据包 * @param [type] $url [description] * @return [type] [description] */ public function SendData($url){ $params = $this->getSign($this->params); $xmldata = $this->ArrToXml($params); $returnData = $this->SendCurl($xmldata,$url); return $this->XmlToArr($returnData); } } /** * 公钥,秘钥的加密,解密 */ class WxRSA { private $public_key_resource = ''''; //公钥资源 private $private_key_resource = ''''; //私钥资源 /** * 构造函数 * @param [string] $public_key [公钥数据字符串] * @param [string] $private_key [私钥数据字符串] */ public function __construct($public_key,$private_key) { $this->public_key_resource = !empty($public_key) ? openssl_pkey_get_public($this->get_public_key($public_key)) : false; $this->private_key_resource = !empty($private_key) ? openssl_pkey_get_private($this->get_private_key($private_key)) : false; } /** * 获取私有key字符串 重新格式化 为保证任何key都可以识别 */ public function get_private_key($private_key){ $search = [ "-----BEGIN RSA PRIVATE KEY-----", "-----END RSA PRIVATE KEY-----", "\\n", "\\r", "\\r\\n" ]; $private_key=str_replace($search,"",$private_key); return $search[0] . PHP_EOL . wordwrap($private_key, 64, "\\n", true) . PHP_EOL . $search[1]; } /** * 获取公共key字符串 重新格式化 为保证任何key都可以识别 */ public function get_public_key($public_key){ $search = [ "-----BEGIN PUBLIC KEY-----", "-----END PUBLIC KEY-----", "\\n", "\\r", "\\r\\n" ]; $public_key=str_replace($search,"",$public_key); return $search[0] . PHP_EOL . wordwrap($public_key, 64, "\\n", true) . PHP_EOL . $search[1]; } /** * 生成一对公私钥 成功返回 公私钥数组 失败 返回 false */ public function create_key() { $res = openssl_pkey_new(); if($res == false) return false; openssl_pkey_export($res, $private_key); $public_key = openssl_pkey_get_details($res); return array(''public_key''=>$public_key["key"],''private_key''=>$private_key); } /** * 用私钥加密 */ public function private_encrypt($input) { openssl_private_encrypt($input,$output,$this->private_key_resource); return base64_encode($output); } /** * 解密 私钥加密后的密文 */ public function public_decrypt($input) { openssl_public_decrypt(base64_decode($input),$output,$this->public_key_resource); return $output; } /** * 用公钥加密 */ public function public_encrypt($input) { openssl_public_encrypt($input,$output,$this->public_key_resource,OPENSSL_PKCS1_OAEP_PADDING); return base64_encode($output); } /** * 解密 公钥加密后的密文 */ public function private_decrypt($input) { openssl_private_decrypt(base64_decode($input),$output,$this->private_key_resource,OPENSSL_PKCS1_OAEP_PADDING); return $output; } }
2019年03月13日
1,024 阅读
0 评论
0 点赞
2019-03-13
微信小程序之 PHP 小程序支付
前言微信小程序开发文档:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_3&index=1需要注意的是: appid必须为最后拉起收银台的小程序appid; mch_id为和appid成对绑定的支付商户号,收款资金会进入该商户号; trade_type请填写JSAPI; openid为appid对应的用户标识,即使用wx.login接口获得的openid代码<?php /* * 小程序微信支付 * time 2018-1-11 13:11 * author-email wanghongbin@ngoos.org */ class WeixinPay { protected $appid; protected $mch_id; protected $key; protected $openid; protected $out_trade_no; protected $body; protected $total_fee; protected $notify_url; function __construct($appid, $openid, $mch_id, $key, $out_trade_no, $body, $total_fee, $notify_url) { $this->appid = $appid; $this->openid = $openid; $this->mch_id = $mch_id; $this->key = $key; $this->out_trade_no = $out_trade_no; $this->body = $body; $this->total_fee = $total_fee; $this->notify_url = $notify_url; } public function pay() { //统一下单接口 $return = $this->weixinapp(); return $return; } //统一下单接口 private function unifiedorder() { $url = ''https://api.mch.weixin.qq.com/pay/unifiedorder''; $parameters = array( ''appid'' => $this->appid, //小程序ID ''mch_id'' => $this->mch_id, //商户号 ''nonce_str'' => $this->createNoncestr(), //随机字符串 ''body'' => $this->body,//商品描述 ''out_trade_no'' => $this->out_trade_no,//商户订单号 ''total_fee'' => $this->total_fee,//总金额 单位 分 ''spbill_create_ip'' => $_SERVER[''REMOTE_ADDR''], //终端IP ''notify_url'' => $this->notify_url, //通知地址 确保外网能正常访问 ''openid'' => $this->openid, //用户id ''trade_type'' => ''JSAPI'' //交易类型 ); //统一下单签名 $parameters[''sign''] = $this->getSign($parameters); $xmlData = $this->arrayToXml($parameters); $return = $this->xmlToArray($this->postXmlCurl($xmlData, $url, 60)); return $return; } private static function postXmlCurl($xml, $url, $second = 30) { $ch = curl_init(); //设置超时 curl_setopt($ch, CURLOPT_TIMEOUT, $second); 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_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20); curl_setopt($ch, CURLOPT_TIMEOUT, 40); set_time_limit(0); //运行curl $data = curl_exec($ch); //返回结果 if ($data) { curl_close($ch); return $data; } else { $error = curl_errno($ch); curl_close($ch); throw new WxPayException("curl出错,错误码:$error"); } } //数组转换成xml private function arrayToXml($arr) { $xml = "<root>"; foreach ($arr as $key => $val) { if (is_array($val)) { $xml.= "<" . $key . ">" . arrayToXml($val) . "</" . $key . ">"; } else { $xml.= "<" . $key . ">" . $val . "</" . $key . ">"; } } $xml.= "</root>"; return $xml; } //xml转换成数组 private function xmlToArray($xml) { //禁止引用外部xml实体 libxml_disable_entity_loader(true); $xmlstring = simplexml_load_string($xml, ''SimpleXMLElement'', LIBXML_NOCDATA); $val = json_decode(json_encode($xmlstring), true); return $val; } //微信小程序接口 private function weixinapp() { //统一下单接口 $unifiedorder = $this->unifiedorder(); // print_r($unifiedorder); $parameters = array( ''appId'' => $this->appid, //小程序ID ''timeStamp'' => '''' . time() . '''', //时间戳 ''nonceStr'' => $this->createNoncestr(), //随机串 ''package'' => ''prepay_id='' . $unifiedorder[''prepay_id''], //数据包 ''signType'' => ''MD5'' //签名方式 ); //签名 $parameters[''paySign''] = $this->getSign($parameters); return $parameters; } //作用:产生随机字符串,不长于32位 private function createNoncestr($length = 32) { $chars = "abcdefghijklmnopqrstuvwxyz0123456789"; $str = ""; for ($i = 0;$i < $length;$i++) { $str.= substr($chars, mt_rand(0, strlen($chars) - 1), 1); } return $str; } //作用:生成签名 private function getSign($Obj) { foreach ($Obj as $k => $v) { $Parameters[$k] = $v; } //签名步骤一:按字典序排序参数 ksort($Parameters); $String = $this->formatBizQueryParaMap($Parameters, false); //签名步骤二:在string后加入KEY $String = $String . "&key=" . $this->key; //签名步骤三:MD5加密 $String = md5($String); //签名步骤四:所有字符转为大写 $result_ = strtoupper($String); return $result_; } ///作用:格式化参数,签名过程需要使用 private function formatBizQueryParaMap($paraMap, $urlencode) { $buff = ""; ksort($paraMap); foreach ($paraMap as $k => $v) { if ($urlencode) { $v = urlencode($v); } $buff.= $k . "=" . $v . "&"; } $reqPar; if (strlen($buff) > 0) { $reqPar = substr($buff, 0, strlen($buff) - 1); } return $reqPar; } } // 使用 $weixinpay = new \\WeixinPay($appid, $openid, $mch_id, $key, $trade_no, $body, $total_fee, $notify_url); $return=$weixinpay->pay();
2019年03月13日
633 阅读
0 评论
0 点赞