当前位置: 首页 > news >正文

PHP应用如何对接微信公众号JSAPI支付

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

    微信支付的产品有很多,1. JSAPI支付  2. APP支付  3. Native支付  4.付款码支付  5. H5支付。 其中基于微信公众号开发的应用选择“JSAPI支付“产品,其他APP支付需要“微信开放平台”,H5支付可以在微信以后浏览器通过一个链接调起微信支付,根据自身的业务场景选择,各产品对接方式基本一致,这里主要讲公众号支付。

涉及平台: 

微信商户平台: https://pay.weixin.qq.com/

微信公众平台: https://mp.weixin.qq.com/

 

微信商户平台的操作部分

1. 没有账号按要求提交资料审核。

2. 通过后记录mch_id,md5_key,以及下载好相关的API安全操作证书,账户中心。

3. 进入产品中心,开通对应的支付产品,比如“JSAPI支付”。

4. 找到“APPID授权管理”,点击关联更多AppID。

8beed2d5f27410b846be41ba2b3100e1956.jpg

5. 填写公众号的AppID,或者小程序的AppID等。

6. 点击开发配置的公众号支付,添加与自己项目对应的域名及目录。

f5a4f4df6c4ff2e8137d8da8478c12aa1e9.jpg

 

微信公众平台的操作部分

1. 登录公众平台,打开“公众号设置”,记录原始ID。

fbb9ebf0b8e4b0b675eddf829259b01c977.jpg

2. “功能设置”中,添加项目的业务域名,JS接口安全域名,网页授权域名。

8158eb0a2ee415a7fcc26284e51ef18414b.jpg

3. 在自己应用中通过对接公众号需要对应的AppID,AppSecret,并把自己服务器IP为加入白名单。

4. 应用中通过接口时,生成Tonken, 和EncodingAESKey并记录下来。

5. 进入微信公众平台,打开基本配置,服务器配置,填写应用的入口地址和上面参数,最后启用即可。

e201a7b28d0fba06aa225991a068b00ccbc.jpg

 

应用程序部分

1. 前端

引入jweixin的SDK到页面中,通过一个接口地址获取预支付id,再使用SDK方法调起支付。

var ua = window.navigator.userAgent.toLowerCase();

if(paytype!=1 && ua.match(/MicroMessenger/i) == 'micromessenger') {		// 微信公众号支付
	if (typeof WeixinJSBridge == "undefined") {
		if(document.addEventListener) {
			document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
		}else if (document.attachEvent) {
			document.attachEvent('WeixinJSBridgeReady', jsApiCall); 
			document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
		}
	}else{

		$.ajax({
			type: "GET",
			url: "{php echo $this->createMobileUrl('pay')}",
			data: {type:type,rid:rid},
			dataType: "json",
			success: function(data) {
				var jsApiParameters = data;
				console.log('FC测试: '+jsApiParameters);
				WeixinJSBridge.invoke('getBrandWCPayRequest', jsApiParameters, function(res) {
						WeixinJSBridge.log(res.err_msg);
						if(res.err_msg == "get_brand_wcpay_request:ok") {
							window.location.reload();
						}
					}
				);
			}

		});
	}

}

2. 后端

if (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false) {      // 微信浏览器
	
	$notify_url = $_W['siteroot'].'addons/xxxxx/wxpay.php';					// 支付后的回调地址

	$model = new HcfkModel();	// 可无视
	$url = "https://api.mch.weixin.qq.com/pay/unifiedorder";                    // 请求预下单接口
	file_put_contents(IA_ROOT."/addons/xxxxx/trade",$trade_no);
	$data["appid"] = $wechat_payment['appid'];								// 微信商户平台AppID
	$data["body"] = '对订单描述一下';
	$data["mch_id"] = $wechat_payment['mchid'];								// 微信商户平台的商户ID
	$data["nonce_str"] = $model->getRandChar(32);
	$data["notify_url"] = $notify_url;
	$data["out_trade_no"] = $trade_no;
	$data["spbill_create_ip"] = $model->get_client_ip();
	$data["total_fee"] = $money*100;
	$data["trade_type"] = "JSAPI";
	$data["openid"] = $openid;												// 用户网页授权后的OpenID,用户对某一公众号是唯一
	$data["sign"] = $model->getSign($data,$wechat_payment['signkey']);		// 对以上请求参数进行加密,加密方式各异,大部分md5
	//echo "<pre>";print_R($data);die;
	$xml = $model->arrayToXml($data);
	$response = $model->postXmlCurl($xml, $url);
	$ress = $model->xmlstr_to_array($response);
	if($ress['return_code']=='FAIL') {
		exit(json_encode(array('code'=>0,'msg'=>$ress['return_msg'])));
	}
	if($ress['result_code']=='FAIL'){
		return $this->result(1, '操作失败',$ress['err_code'].$ress['err_code_des']);
	}
	if($ress['return_code']=='SUCCESS'){                                            // 预下单成功返回支付“需要的参数”
		$datas["appId"] = $wechat_payment['appid'];                                 // appid
		$datas["nonceStr"] = $model->getRandChar(32);                               // 32位随机串
		$datas["package"] = "prepay_id=".$ress['prepay_id'];                        // 预支付id
		$datas['signType'] = "MD5";
		$datas["timeStamp"] = time().'';
		$datas["paySign"] = $model->MakeSign($datas,$wechat_payment['signkey']);    // 签名
		exit(json_encode($datas));
	}else{
		exit(json_encode(array('code'=>0,'msg'=>'操作失败')));
	}

}

 

补充(20190605):

调取微信支付相关接口需要一个秘钥,也就是对请求参数进行签名时的一个key, 例如md5_key等等,这个支付秘钥的设置需要再做一些操作:

1. 重新登录进入微信支付商户平台

2. 找到“账户中心”-> “API安全”

d8c2e23d40044c7a64110ad42effd010eba.jpg

 

3. api秘钥,设置秘钥,然后自己自定义一个32位字符串包含大小写字母和数字,输入平台支付密码和手机验证码就可以设置完成了。

7212ebb0d436ce624c8ecaed4402ae6bf03.jpg

 

公众号

转载于:https://my.oschina.net/u/2456768/blog/3050527

相关文章:

  • Leetcode 11 - Container With Most Water
  • Oracle 12c:ORA-28040
  • 002-QC的使用
  • JavaScript 函数式编程技巧 - 反柯里化
  • 线程池没你想的那么简单
  • 第九周总结
  • 聊聊Dubbo(九):核心源码-服务端启动流程2
  • Nginx和Apache
  • 重学ES6 Set 数据结构(2)
  • webpack treeshking的三个要点
  • 安装固态硬盘,小米笔记本13.3
  • 利用requests库访问360主页20次
  • Linux入门学习
  • 前端之移动页面布局
  • 获取html资源
  • 分享的文章《人生如棋》
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • CSS相对定位
  • Git学习与使用心得(1)—— 初始化
  • js
  • js对象的深浅拷贝
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Markdown 语法简单说明
  • MySQL用户中的%到底包不包括localhost?
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • RxJS: 简单入门
  • uva 10370 Above Average
  • 分布式事物理论与实践
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 前嗅ForeSpider中数据浏览界面介绍
  • 用element的upload组件实现多图片上传和压缩
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • #传输# #传输数据判断#
  • #在 README.md 中生成项目目录结构
  • (06)Hive——正则表达式
  • (11)MATLAB PCA+SVM 人脸识别
  • (C#)一个最简单的链表类
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (二)c52学习之旅-简单了解单片机
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (一)80c52学习之旅-起始篇
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)linux 命令大全
  • ... 是什么 ?... 有什么用处?
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET CORE 第一节 创建基本的 asp.net core