我是靠谱客的博主 鲜艳日记本,最近开发中收集的这篇文章主要介绍微信小程序 openid及支付的若干问题解决方案,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 

微信小程序API帮助文档中介绍

wx.login(OBJECT)

调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key)等。用户数据的加解密通讯需要依赖会话密钥完成。

登录时序图

(1)通过调用login方法可以从微信服务器获取code

 1  wx.login({
 2
success: function(res) {
 3
if (res.code) {
 4
//发起网络请求
 5 
wx.request({
 6
url: 'https://test.com/onLogin',
 7 
data: {
 8 
code: res.code
 9 
}
10 
})
11
} else {
12
console.log('获取用户登录态失败!' + res.errMsg)
13 
}
14 
}
15
});
 1  wx.request({
 2
url: 'https://×××××',
 3 
data: {
 4 
js_code: jscode
 5 
},
 6
method: 'POST',
 7
header: { 'content-type': 'application/x-www-form-urlencoded' }, // 设置请求的 header
 8
success: function (res) {
 9
app.globalData.openid = res.data['openid'];
10
console.log("res.data.openid=" + res.data['openid']);
11
console.log("app.globalData.openid =" + app.globalData.openid );
12 
}
13
});

 

(2)把code提交到自己的服务器,并通过微信服务器对code进行验证

https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
服务器端接收验证代码
 1 function getOpenidAction() {
 2
 3
$js_code= $_POST['js_code'];
 4
//echo 'js_code=' .$js_code;
 5
$appid = '小程序ID';
 6
$appsecret = '小程序的密钥';
 7
$access_url = "https://api.weixin.qq.com/sns/jscode2session?appid=".$appid."&secret=".$appsecret."&js_code=".$js_code."&grant_type=authorization_code";
 8
$str = $this->https_request($access_url);
 9
print_r($str);
10 
}
11
12
13
//发起https请求
14
function https_request($url)
15 
{
16
$curl = curl_init();
17
curl_setopt($curl, CURLOPT_URL, $url);
18
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
19
curl_setopt($curl,
CURLOPT_SSL_VERIFYHOST, FALSE);
20
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
21
curl_setopt($curl, CURLOPT_TIMEOUT, 500);
22
$data = curl_exec($curl);
23
if (curl_errno($curl)){
24
return 'ERROR';
25 
}
26
curl_close($curl);
27
return $data;
28
}

最后开发者服务器使用登录凭证 code 获取 session_key 和 openid。

 

 

二、微信小程序支付

通过返回的openid,对requestpayment方法进行组装

 1 
wx.request({
 2
url: 'https://你的域名/wp-wxpay/pay/app.php',
 3 
data: {
 4 //全局变量
 5 
openid: app.globalData.openid,
 6 //定义支付金额
 7 
total_fee: total_fee
 8 
},
 9
header: { 'content-type': 'application/x-www-form-urlencoded' }, // 设置请求的 header
10
method: 'POST',
11
success: function (res) {
12
var temp = res.data;
13
console.log("timestamp = " + temp);
14 //调用支付方法,整合参数后,提交到服务器验证审核
15 
wx.requestPayment({
16
'timeStamp': res.data.timeStamp,
17
'nonceStr': res.data.nonceStr,
18
'package': res.data.package,
19
'signType': 'MD5',
20
'paySign': res.data.paySign,
21
'success': function (res) {
22 
},
23
'fail': function (res) {
24 
wx.showToast({
25
title: '报名失败!',
26
icon: 'success'
27 
});
28 
},
29
complete: function (res) {
30
if (res.errMsg == 'requestPayment:fail cancel') {
31 
wx.showToast({
32
title: '取消报名',
33
icon: 'success'
34 
});
35 
}
36
37 
}
38 
});
39 
},
40
41
});
后端代码:

1. pay.php //小程序请求的后端地址


 1 <?php
 2 /**
 3  * Created by PhpStorm.
 4  * User: UFO
 5  * Date: 17/7/18
 6  * Time: 下午5:31
 7
*/
 8 require_once
('WxPay.Api.php');
 9
10 class WXPay
{
11
function index() {
12
//
初始化值对象

13
$input = new WxPayUnifiedOrder();
14
//
文档提及的参数规范:商家名称-销售商品类目

15
$input->SetBody("testceshi");
16
//
订单号应该是由小程序端传给服务端的,在用户下单时即生成,demo中取值是一个生成的时间戳

17
$input->SetOut_trade_no(time().'');
18
//
费用应该是由小程序端传给服务端的,在用户下单时告知服务端应付金额,demo中取值是1,即1分钱

19
$input->SetTotal_fee("1");
20
$input->SetNotify_url("https://...com/notify.php");//需要自己写的notify.php

21
$input->SetTrade_type("JSAPI");
22
//
由小程序端传给后端或者后端自己获取,写自己获取到的,

23
$input->SetOpenid('UdhncondJcnkJnjknkcssdcAbckn');
24
//$input->SetOpenid($this->getSession()->openid);
25 
//
向微信统一下单,并返回order,它是一个array数组

26
$order = WxPayApi::unifiedOrder($input);
27
//
json化返回给小程序端

28
header("Content-Type: application/json");
29
echo $this->getJsApiParameters($order);
30 
}
31
32
private function getJsApiParameters($UnifiedOrderResult)
33
{
//判断是否统一下单返回了prepay_id

34
if(!array_key_exists("appid", $UnifiedOrderResult)
35
|| !array_key_exists("prepay_id", $UnifiedOrderResult)
36
|| $UnifiedOrderResult['prepay_id'] == "")
37 
{
38
throw new WxPayException("参数错误");
39 
}
40
$jsapi = new WxPayJsApiPay();
41
$jsapi->SetAppid($UnifiedOrderResult["appid"]);
42
$timeStamp = time();
43
$jsapi->SetTimeStamp("$timeStamp");
44
$jsapi->SetNonceStr(WxPayApi::getNonceStr());
45
$jsapi->SetPackage("prepay_id=" . $UnifiedOrderResult['prepay_id']);
46
$jsapi->SetSignType("MD5");
47
$jsapi->SetPaySign($jsapi->MakeSign());
48
$parameters = json_encode($jsapi->GetValues());
49
return $parameters;
50 
}
51 //这里是服务器端获取openid的函数
52 //
private function getSession() {
53 //
$code = $this->input->post('code');
54 //
$url = 'https://api.weixin.qq.com/sns/jscode2session?appid='.WxPayConfig::APPID.'&secret='.WxPayConfig::APPSECRET.'&js_code='.$code.'&grant_type=authorization_code';
55 //
$response = json_decode(file_get_contents($url));
56 //
return $response;
57 //
}

58 }
59 $WxPay = new WXPay();
60 $WxPay->index();

具体微信的支付SDK接口开发,可以参照微信官方的SDK开发包。

微信SDK 下载链接:https://pay.weixin.qq.com/wiki/doc/api/download/WxpayAPI_php_v3.zip


转载于:https://www.cnblogs.com/jhlqab/p/7850036.html

最后

以上就是鲜艳日记本为你收集整理的微信小程序 openid及支付的若干问题解决方案的全部内容,希望文章能够帮你解决微信小程序 openid及支付的若干问题解决方案所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部