文章转自:https://zuoluo11.github.io/2017/07/04/%E5%BE%AE%E4%BF%A1%E5%85%AC%E4%BC%97%E5%8F%B7%E9%9B%86%E5%90%88%E6%94%AF%E4%BB%98%E5%AE%9D%E6%94%AF%E4%BB%98/              感谢本作者

API及业务逻辑

手机网站支付API可以前往以下网址查看及下载sdk:
目前手机网站支付demo有: JAVA和PHP版本
SDK则有:JAVA、.NET和PHP版本

手机支付API

SDK下载

微信公众号集成帮助包

签名sign生成规则

代码实现

###普通手机网站用户进行确认下单页面

 
namespace AliPayDemo
{
public partial class Pay : System.Web.UI.Page
{
//不是真实数据
string APPID = "2017090907474487"; //应用ID
//应用私钥
string APP_PRIVATE_KEY = @ "****JEwKBgQCIFY+12QuI3gI478vsixJiYOWJb2T7MRr0Zlg2n3fnQWnVB2gOkSgls/CHM3y+d/GQRJRE5aFWa2Xt";
//支付宝公钥
string ALIPAY_PUBLIC_KEY = @ "***PXZOf8eQx+qWGky6LJZWie4IF2oqY7El1nps2qVg1IbQkDdIMNSr2a2nQF5GwSpVcF7bRZeNG2qgs3EjHu4hGqXMWbg6Fvs1iigiBYfkzQIDAQAB";
string CHARSET = "utf-8"; //编码格式
protected void Page_Load(object sender, EventArgs e)
{
//SDK已经封装掉了公共参数,只需要初始化一次
IAopClient client = new DefaultAopClient( "https://openapi.alipay.com/gateway.do", APPID, APP_PRIVATE_KEY, "json", "1.0", "RSA2", ALIPAY_PUBLIC_KEY, CHARSET, false);
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称如:alipay.trade.wap.pay.request
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数
//此次只是参数展示,未进行字符串转义,实际情况下请转义
//注意value类型,如金额没有引号,
request.BizContent = "{" +
" \"subject\":\"大乐透\"," +
" \"out_trade_no\":\"70501111111S0011111191\"," +
" \"total_amount\":0.01," +
" \"product_code\":\"QUICK_WAP_WAY\"" +
" }";
AlipayTradeWapPayResponse response = client.pageExecute(request);
divBody.InnerHtml = response.Body;
调用成功,则处理业务逻辑
//if (response.IsError)
//{
// //.....
//}
}
}
}

###微信公众号内用户进行确认下单页面
1、下载集成微信公众号的帮助包并将文件放入项目文件夹中
ap.js 跳转到自带浏览器js
pay.htm 提示用户跳转htm页面
1、使用pageExecute方法,以GET方式获得url字符串;这个就得到了拼接好的支付url返回前台a标签里面就可以了

1
2
AlipayTradeWapPayResponse response = client.pageExecute(request,null,"GET");
test = response.Body;

2、将Url传入前台页面标签,待用户点击确定

1
<a id="test" href="<%=test%>" class="button button-big button-fill">支付宝结算 </a>

3、用户点击页面后跳转到提示页,提示用户使用手机自带浏览器打开连接

4、完成支付

5、整体的代码

前端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="JsApiPayPage1.aspx.cs" Inherits="JsApiPayPage1" %>
<!DOCTYPE html>
<html>
<head runat="server">
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<title>微信支付 </title>
</head>
<body style="background-color: #efeff4;">
<form runat="server" id="calculator" v-cloak>
<div class="content-block">
<a id="test" href="<%=test%>" class="button">支付宝结算 </a>
</div>
</form>
</body>
</html>
<script>
//绑定单击事件
var btn = document.querySelector( "#test");
btn.addEventListener( "click", function (e) {
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
//ele.href 是GET到支付宝收银台的URL
_AP.pay(e.target.href);
return false;
}, false);
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System;
using System.Collections.Generic;
using CYQ.Data;
using Web.Lianmengban_2016;
using CYQ.Data.Table;
using Aop.Api.Util;
using Aop.Api;
using Aop.Api.Request;
using Aop.Api.Response;
public partial class JsApiPayPage1 : System.Web.UI.Page
{
public static string test { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
CreateAliPayPramaters();
}
private void CreateAliPayPramaters()
{
//pageExecute<T>(IAopRequest<T> request, string accessToken, string reqMethod) where T : AopResponse
IAopClient client = new DefaultAopClient( "https://openapi.alipay.com/gateway.do", AliConfig.APP_ID, AliConfig.APP_PRIVATE_KEY, "json", "1.0", "RSA2", AliConfig.ALIPAY_PUBLIC_KEY, AliConfig.CHARSET, false);
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称如:alipay.open.public.template.message.industry.modify
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
//AlipayOpenPublicTemplateMessageIndustryModifyRequest request = new AlipayOpenPublicTemplateMessageIndustryModifyRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数
//此次只是参数展示,未进行字符串转义,实际情况下请转义
request.BizContent = "{" +
" \"subject\":\"大乐透\"," +
" \"out_trade_no\":\"70501111111S0011111191\"," +
" \"total_amount\":0.01," +
" \"product_code\":\"QUICK_WAP_WAY\"" +
" }";
AlipayTradeWapPayResponse response = client.pageExecute(request,null, "GET");
test = response.Body;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class AliConfig
{
//=======【基本信息设置】=====================================
/* 支付宝手机网页支付信息配置
public const string URL = "https://openapi.alipay.com/gateway.do";
public const string APP_ID = "20170111111144";
public const string APP_PRIVATE_KEY = @"MIIEowIBAAKCAQEA31kawX3d***t";
public const string FORMAT = "json";
public const string CHARSET = "utf-8";
public const string ALIPAY_PUBLIC_KEY = @"MIIBIjANBgkqhkiG9***";
public const string SIGN_TYPE = "RSA2";
public const string SELLER_EMAIL = "1234@123.com";
public const string NOTIFY_URL = "http://www.222.net/ResultNotifyAliPay.aspx";
public const string RETURN_URL = "http://www.222.net/AliReturnPage.aspx";
}

总结及出现的问题

1、参数的内容
按照api提供的列表把必填项的key及value一定要写全,写对;
2、BizContent的业务参数内多个参数之间用“,”号隔开,之前忘记写全,报错;
3、签名错误
sign_valid

API里面生成签名,包括sign_type
接收支付宝的异步通知时,验签之前不包括sign 和 sign_type

签名sign生成规则

支付宝官方sdk有个bug,Aop.Api.Util.AlipaySignature类中方法没有去掉sign_type就进行验证,导致出错;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public static bool RSACheckV2(IDictionary<string, string> parameters, string publicKeyPem)
{
string sign = parameters[ "sign"];
parameters.Remove( "sign");
parameters.Remove( "sign_type"); //新增修改bug
string signContent = GetSignContent(parameters);
return RSACheckContent(signContent, sign, publicKeyPem, DEFAULT_CHARSET, "RSA");
}
public static bool RSACheckV2(IDictionary<string, string> parameters, string publicKeyPem, string charset)
{
string sign = parameters[ "sign"];
parameters.Remove( "sign");
parameters.Remove( "sign_type"); //新增修改bug
string signContent = GetSignContent(parameters);
return RSACheckContent(signContent, sign, publicKeyPem, charset, "RSA");
}
public static bool RSACheckV2(IDictionary<string, string> parameters, string publicKeyPem, string charset, string signType, bool keyFromFile)
{
string sign = parameters[ "sign"];
parameters.Remove( "sign");
parameters.Remove( "sign_type"); //新增修改bug
string signContent = GetSignContent(parameters);
return RSACheckContent(signContent, sign, publicKeyPem, charset, signType, keyFromFile);
}

4、交易订单处理失败 请稍后再试 ali38173
转到支付宝时,弹出这个错误,找了很久,才发现是由于Bizcontent的最后一个}括号内包含一个全角的空格,很坑啊;

公众号中调用支付宝支付相关推荐

  1. 微信公众号中的支付宝支付与微信支付 支付宝支付问题(微信bug)

    一般,在微信公众号中的商城都是需要支持微信支付和支付宝支付的,当然,较大的公司对于鹅厂和阿里的站队就不说了,所以这里简单记录一下支付宝支付和微信支付的主要流程.说是简单介绍,这是因为确实不难,因为前端 ...

  2. 支付宝支付功能实现原理,微信公众号中实现支付宝支付功能开发流程

    这篇文章使用一些简单的代码例子来解释微信接入支付宝支付功能的操作步骤,即使新手也可以轻松参透的. 第三方支付是指具备一定实力和信誉保障的独立机构,采用与各大银行签约的方式,通过与银行支付结算系统接口对 ...

  3. vue 在微信公众号里使用支付宝支付(h5支付宝支付)

    vue 在微信公众号里使用支付宝支付(h5支付宝支付) 需求:在微信公众号里面支持支付宝支付. 思路:微信是不能直接调用支付宝的,所以我们需要使用一个中间页提示用户在浏览器中打开,然后进行支付宝网页或 ...

  4. vue支付宝html,vue 解决在微信内置浏览器中调用支付宝支付的情况

    我的思路大概是这样的 1. 验证是否是在微信内置浏览器中调用支付宝 2.给支付页面的url加上调用接口所需的参数(因为在微信里是不能直接调用支付宝的需要调用外部浏览器) 3.在外部浏览器中完成支付跳转 ...

  5. java 中调用支付宝支付功能的接口

    支付宝接口: 申请支付宝接口服务:  1.https://fuwu.alipay.com/platform/doc.htm#c11    Java-JDK 1.5 SDK 2.https://csha ...

  6. 视频存储与公众号中播放的解决方案(直接调用代码或公众号调用视频地址)

    企业视频产品宣传片的制作,有利于企业形象的树立,还可以得到公众的信赖,为企业营销做直观形象的铺垫.企业宣传片作为企业的工具,集合视听语言于一身,可以从听觉和视觉两个方面来展示企业和产品.这种本身的直观 ...

  7. 微信H5调用支付宝支付详细(一)!!!

    微信公众号H5页面使用支付包手机网站支付!!! 这两天根据公司的需求写了一个从微信公众号的H5(公众号中的网站)页面跳转支付宝支付,大家应该都知道微信和支付宝这两家 谁也不让这谁.想在微信中用支付宝那 ...

  8. 微信(jspai版本即公众号h5版)支付-微信下单支付及企业转账到零钱

    微信(jspai版本即公众号h5版)支付-微信下单支付及企业转账到零钱 一.后端前置条件 二.配置h5 devServer 三.后端开发代码 四.前端开发代码(uniapp) 一.后端前置条件 准备好 ...

  9. php编程之如何调用支付宝支付接口的实现

    对于任何一款软件来说,支付功能都是核心的,那么目前的主流支付接口主要是支付宝.微信和银联卡,而大多数开发技术人员对于如何调用支付宝的支付接口还存在很大的困扰,今天就来跟大家分享一下如何正确调用支付宝支 ...

最新文章

  1. 华为鸿蒙运行视频,某游戏在华为鸿蒙运行,被识别成使用安卓模拟器
  2. 【Windows】Windows Restart Manager 重启管理器
  3. HtmlUnit自动填写表单并提交
  4. deb 安装_本地安装DEB包的3种命令行工具(适合Ubuntu和Deepin )
  5. table T371A field IBTYP的search help
  6. mysql 多项式_mysql主从复制原理及实现
  7. Android之——自己定义TextView
  8. CommonJS模块的循环加载
  9. 各类手机开发平台介绍(转载)
  10. python将列表写入文件_Python将列表数据写入文件(txt, csv,excel)
  11. java win8 mac地址_Win8系统查看mac地址的两种方法
  12. Arduino下的marlin固件配置基础
  13. 指数分布,卡方分布和伽马分布
  14. 18套桁架机械手双轴/图纸龙门架机器人SolidWorks3D模型设计图纸
  15. 【Python】把excel文件中的数据转化为字典格式存起来
  16. matlab输入一个3位整数,matlab随机产生一个3位整数,将它的十位数变为0。例如,输入738则输出708。...
  17. (一)C++11 原生标准多线程:认识多线程
  18. 微信小程序——云开发的安全规则
  19. 学习python需要很多数学知识吗_Python数据分析需要学习哪方面的数学知识
  20. re管理器修改音量_[教程] 自己手动修改音量键和开机键的功能方法(小更新)

热门文章

  1. android-4.0.4
  2. html怎么防止表单重复提交表单,8.10 防止表单重复提交
  3. 百度网页分享工具下线
  4. 一些小故事,好像有点乱
  5. 查询网站有没有被搜狗收录复杂吗?查询搜狗收录简单的方法
  6. 1. RPC原理解析
  7. python列表去重_python列表去重
  8. java frf_java 多态性
  9. javascript案例24——班级成绩求和、求平均值
  10. openlayer 绘制扇形