最近项目涉及到小程序开发:需要进行微信支付模块,接下来通过叙述,记录一下微信小程序中微信支付模块的开发,以便日后翻阅和使用。

学习指南----------微信支付开发文档:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_11&index=2

1、在开发小程序微信支付之前,首先需要申请账号,注册一个小程序开发者账号,并进行微信认证。

2、小程序开通微信支付

获取到appid(小程序ID)、AppSecret 、MchID(商户ID)、API Key

商户系统和微信支付系统主要交互:

1、小程序登录接口、获取openid(小程序登录)

2、商户端调用支付统一下单接口,返回预付单信息(统一下单)

3、小程序端显示二维码,客户扫码支付,小程序端鉴权调起支付,返回支付结果到小程序端(再次签名)

4、推送支付结果到小程序端(支付结果通知API)

5、商户查询支付结果(查询订单API)

注意点:

1、签名 需要对所有非空参数按照参数名ASSIC字典序排序,拼接API密钥MD5加密后转大写。

2、需要将所有参数转xml形式,使用curl发起请求。再将获取到的返回值从xml形式转化为数组进行取值。 注意返回参数都是大写。

以下几个通用函数方法:

	/**
* 签名算法
* 1、对参数按照key=value的格式,并按照参数名ASCII字典序排序
* ◆ 参数名ASCII码从小到大排序(字典序);
◆ 如果参数的值为空不参与签名;
◆ 参数名区分大小写;
◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段
*2、 拼接上key,MD5加密,并将字符串全部转成大写,拼接API密钥
*
* @param unknown $post
*/
function getSign($post){
$stringA = '';
ksort($post);//key值排序 参数名ASCII码从小到大排序(字典序)
foreach ($post as $key=>$value){
if(!$value)continue;
if(!$stringA){
$stringA= $key."=".$value;
}else{
$stringA.= "&".$key."=".$value;
}
}
$stringA.='&key='.$APIKey;
$sign = strtoupper(md5($stringA));
return $sign;
}
    /**
* 随机的32位字符串
* @param unknown $len
*/
private function getNonceStr($len){
$a=range('a','z');
$b=range('A','Z');
$c=range('0','9');
$chars=array_merge($a,$b,$c);
$charslen=count($chars)-1;
shuffle($chars);
$nonce_str='';
for($i=0;$i<$len;$i++){
$nonce_str.=$chars[mt_rand(0,$charslen)];
}
return $nonce_str;
}

  

    /**
* curl请求
* @param unknown $url
* @param unknown $data
* @param array $headers
*/
private function http_request($url,$data = null,$headers=array()) {
$curl = curl_init();
if( count($headers) >= 1 ){
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
}
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
if (!empty($data)){
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($curl);
curl_close($curl);
return $output;
}

  

private function getIP(){
if(!empty($_SERVER['HTTP_CDN_SRC_IP'])){
$ip = $_SERVER['HTTP_CDN_SRC_IP']; }else if (getenv('HTTP_CLIENT_IP')){
$ip = getenv('HTTP_CLIENT_IP'); }else if (getenv('HTTP_X_FORWARDED_FOR')){ //获取客户端用代理服务器访问时的真实ip 地址
$ip = getenv('HTTP_X_FORWARDED_FOR'); }else if (getenv('HTTP_X_FORWARDED')){
$ip = getenv('HTTP_X_FORWARDED'); }else if (getenv('HTTP_FORWARDED_FOR')){
$ip = getenv('HTTP_FORWARDED_FOR'); }else if (getenv('HTTP_FORWARDED')){
$ip = getenv('HTTP_FORWARDED'); }else{
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}

  

 

微信小程序------微信支付模块的更多相关文章

  1. 微信小程序篇(微信小程序的支付)

    微信小程序的支付和微信公众号的支付是类似的,对比起来还比公众号支付简单了一些,我们只需要调用微信的统一下单接口获取prepay_id之后我们在调用微信的支付即可. 今天我们来封装一般node的支付接口 ...

  2. 【微信小程序】支付过程详解

    一.介绍 今天跟大家分享微信小程序集成支付. 二.分析 1.小程序支付API 地址:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-pay.html ...

  3. 微信小程序在线支付功能使用总结

    最近需要在微信小程序中用到在线支付功能,于是看了一下官方的文档,发现要在小程序里实现微信支付还是很方便的,如果你以前开发过服务号下的微信支付,那么你会发现其实小程序里的微信支付和服务号里的开发过程如出 ...

  4. 微信小程序—微信自动退款

    微信小程序—微信自动退款 一.业务背景 微信自动退款串接基于酷客多小程序商城系统,为方便财务人员进行订单退款而开发,将酷客多小程序系统财务退款流程和微信退款系统打通.实现一个系统管理运营. 二.业务流 ...

  5. 微信小程序-微信自动退款(Java后台)

    微信小程序-微信自动退款 1.首先分享 微信自动退款接口: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4 微信付款 代码案例 ...

  6. 微信小程序+微信管理后台+微信用户前台

    代码地址如下:http://www.demodashi.com/demo/15043.html #### 微信小程序+微信管理后台+微信用户前台 #### 产品介绍 基础功能开发:景区微信地图导游.天 ...

  7. 前端调用微信小程序的支付流程

    目录 1,前言 2,流程 3,参数说明 4,具体代码 1,前言 分享一个完整的微信小程序支付流程中,前端要做的模块. 2,流程 在调用wx.requestPayment之前,需要准备一些参数,流程如下 ...

  8. 微信小程序——微信支付

    这个讲起来也就比较麻烦一点,因为需要的不仅仅是咱们代码上的技术,嘿嘿! 先整理一下思路.如果想做微信支付: 1.现有一个公司账户(非个人账户),并且实名认证过的. 2.微信号 必须开通微信支付功能. ...

  9. 微信小程序实现支付功能

    小程序支付,没有封装支付代码:直接上一段可用的流程代码吧:微信小程序支付官网文档有详细的说明,这里我就不再赘述啦:客户端js: wx.request({ url:'https://www.xxxx.c ...

随机推荐

  1. Linux 下的静态(函数)库、动态(函数)库

    0. 基本 在命名上,静态库的名字一般是 libxxx.a,动态库的名字一般是 libxxx.so,有时 libxxx.so.major.minor,xxx 是该 lib 的名字,major 是主版本 ...

  2. 【转载】Nginx 的工作原理 和优化

    1. Nginx的模块与工作原理 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(locati ...

  3. C#6.0的新特性之内插字符串

    https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/interpolated-strings C# 6 ...

  4. Unity3d 应用系统分析

  5. bzoj1483: [HNOI2009]梦幻布丁(vector+启发式合并)

    1483: [HNOI2009]梦幻布丁 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 4022  Solved: 1640[Submit][Statu ...

  6. ionic2 如何引入第三方cordova插件

    例如:cordova-plugin-wechat 这个插件可以做微信登录,分享支付等 首先第一步:ionic plugin add cordova-plugin-wechat --variable w ...

  7. [App Store Connect帮助]七、在 App Store 上发行(1)App 发行流程概述

    在 App Store 上发行 App 的一般流程如下. 第 1 步:选择您的构建版本 每个 App 都可以有多个版本,且每个版本也可以有多个构建版本.若要在 App Store 上发行您的 App, ...

  8. Reshapeing operations

    Reshapeing operations Suppose we have the following tensor: t = torch.tensor([ [1,1,1,1], [2,2,2,2], ...

  9. 【原创】《从0开始学Elasticsearch》—初识Elasticsearch

    目录 1. Elasticsearch 是什么2. Elasticsearch 中基本概念3. Elasticsearch 安装4. 访问 Elasticsearch 1. Elasticsearch ...

  10. Monkey Banana Problem LightOJ - 1004

    Monkey Banana Problem LightOJ - 1004 错误记录: 1.数组开小2.每组数据数组没有清空 #include<cstdio> #include<cst ...