三方支付宝商家和个人区别SDK和WAP有什么区别

支付宝Wap支付你了解多少? - 简书
支付宝Wap支付你了解多少?
上几篇文章详细介绍了、
此文章来介绍下支付宝Wap支付(也叫作手机网站支付)
1、创建应用并获取APPID
2、配置应用环境
3、配置沙箱环境
4、服务端实现(Maven添加本地Jar包、集成并配置SDK)
先上,支付宝文档入口模仿微信最最近做了更新,变得更简洁明了。
1、创建应用并获取APPID
这个比较简单可以参考
2、配置应用环境
开发者调用接口前需要先生成RSA密钥,RSA密钥包含应用私钥(APP_PRIVATE_KEY)、应用公钥(APP_PUBLIC_KEY)。生成密钥后在开放平台管理中心进行密钥配置,配置完成后可以获取支付宝公钥(ALIPAY_PUBLIC_KEY)。详细步骤请参考。
为了方便开发者生成一对RSA密钥支付宝提供一键生成工具,具体如何生成与配置密钥详见。
下载该工具后,解压打开文件夹,运行“RSA签名验签工具.bat”(WINDOWS)或“RSA签名验签工具.command”(MAC_OSX)。
以下演示截图
Window 配置应用环境生成相关Key截图参考上篇文档
以下是Mac电脑生成RSA密钥工具截图
Mac 生成RSA密钥工具.png
生成密钥.png
工具生成一对RSA密钥之后将公钥配置到应用环境。
生成的私钥需妥善保管,避免遗失,不要泄露。应用私钥需填写到代码中供签名时使用。应用公钥需提供给支付宝账号管理者上传到支付宝开放平台。
上传支付宝公钥.png
3、配置沙箱环境
注意:沙箱环境的密钥最好与正式上线的应用进行区分避免一些不必要的麻烦。WAP支付支持沙箱环境而app支付不支持沙箱环境
上传对应的公钥,沙箱账号待会在测试的时候回使用到
沙箱环境配置.png
沙箱工具.png
4、服务端实现(集成并配置SDK)
服务端SDK下载与简介
服务端SDK下载
Maven项目中使用本地JAR包
1、首先我在项目根目录中创建一个lib文件夹,将jar包拷贝到lib文件夹下
2、然后我们在maven的pom.xml中配置
&dependency&
&groupId&com.alibaba&/groupId&
&artifactId&alipay-sdk-java&/artifactId&
&version&25&/version&
&scope&system&/scope&
&systemPath&${project.basedir}/lib/alipay-sdk-java25.jar&/systemPath&
&/dependency&
3、这里的groupId和artifactId以及version都是可以随便填写的 ,scope必须填写为system,而systemPath我们现在我们jar包的地址就可以了
4、最后我们必须在maven打包的过程中加入我们这个jar包。因为项目运行的时候需要这个Jar,并且我们得拷贝在WEB-INF/lib目录下
&groupId&org.apache.maven.plugins&/groupId&
&artifactId&maven-war-plugin&/artifactId&
&configuration&
&webResources&
&resource&
&directory&${project.basedir}/lib&/directory&
&targetPath&WEB-INF/lib&/targetPath&
&filtering&false&/filtering&
&includes&
&include&**/*.jar&/include&
&/includes&
&/resource&
&/webResources&
&/configuration&
&version&2.1.1&/version&
在使用SDK调用具体API前,需要先配置通用接入参数
1、APP_ID 使用沙箱模式中的APP_ID.
2、APP_PRIVATE_KEY ALIPAY_PUBLIC_KEY 使用文章2、配置应用环境中生成的测试密钥.
3、CHARSET 默认使用UTF-8
然后,使用上述接入参数初始化AlipayClient:
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",APP_ID,APP_PRIVATE_KEY,"json",CHARSET,ALIPAY_PUBLIC_KEY);
接下来,就可以用alipayClient来调用具体的API了。alipayClient只需要初始化一次,后续调用不同的API都可以使用同一个alipayClient对象。
手机网站支付不支持第三方授权,不能代商家发起请求。
手机网站支付产品包含两类API:
页面跳转类:需要从前端页面以Form表单的形式发起请求,浏览器会自动跳转至支付宝的相关页面(一般是收银台或签约页面),用户在该页面完成相关业务操作后再回跳到商户指定页面。例如本产品中的。
系统调用类:直接从服务端发起HTTP请求,支付宝会同步返回请求结果。例如本产品中的交易查询等配套API。
调用流程图
使用SDK快速接入
手机网站支付alipay.trade.wap.pay:
对于页面跳转类API,SDK不会也无法像系统调用类API一样自动请求支付宝并获得结果,而是在接受request请求对象后,为开发者生成前台页面请求需要的完整form表单的html(包含自动提交脚本),商户直接将这个表单的String输出到http response中即可。
public void doPost(HttpServletRequest httpRequest,
HttpServletResponse httpResponse) throws ServletException, IOException {
AlipayClient alipayClient = ... //获得初始化的AlipayClient
AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();//创建API对应的request
alipayRequest.setReturnUrl("http://domain.com/CallBack/return_url.jsp");
alipayRequest.setNotifyUrl("http://domain.com/CallBack/notify_url.jsp");//在公共参数中设置回跳和通知地址
alipayRequest.setBizContent("{" +
\"out_trade_no\":\"01002\"," +
\"total_amount\":88.88," +
\"subject\":\"Iphone6 16G\"," +
\"seller_id\":\"9012\"," +
\"product_code\":\"QUICK_WAP_PAY\"" +
}");//填充业务参数
String form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
httpResponse.setContentType("text/charset=" + AlipayServiceEnvConstants.CHARSET);
httpResponse.getWriter().write(form);//直接将完整的表单html输出到页面
httpResponse.getWriter().flush();
异步通知验签
Map&String, String& paramsMap = ... //将异步通知中收到的所有参数都存放到map中
boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, ALIPAY_PUBLIC_KEY, CHARSET) //调用SDK验证签名
if(signVerfied){
// TODO 验签成功后,按照支付结果异步通知中的描述,对支付结果中的业务内容进行二次校验,校验成功后在response中返回success并继续商户自身业务处理,校验失败返回failure
// TODO 验签失败则记录异常日志,并在response中返回failure.
服务端具体封装
将参数独立配置在一个属性文件中方便管理,当然也可以从数据库
沙盒环境配置参数
加载接入参数并初始化AlipayClient
加载接入参数并初始化`AlipayClient`
使用SDK快速接入代码封装
public void wapPay(){
String body="我是测试数据";
String subject="Iphone6 16G";
String total_amount="0.01";
String passback_params="1";
BizContent content = new BizContent();
content.setBody(body);
content.setOut_trade_no(OrderInfoUtil2_0.getOutTradeNo());;
content.setPassback_params(passback_params);
content.setSubject(subject);
content.setTotal_amount(total_amount);
content.setProduct_code("QUICK_WAP_PAY");
AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();//创建API对应的request
alipayRequest.setReturnUrl("http://javen.tunnel.qydev.com/alipay/return_url");
alipayRequest.setNotifyUrl("http://javen.tunnel.qydev.com/alipay/notify_url");//在公共参数中设置回跳和通知地址
//参数参考 https://doc.open.alipay.com/doc2/detail.htm?treeId=203&articleId=105463&docType=1#s0
System.out.println(JsonKit.toJson(content));
alipayRequest.setBizContent(JsonKit.toJson(content));//填充业务参数
String form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
HttpServletResponse httpResponse = getResponse();
httpResponse.setContentType("text/charset=" + charset);
httpResponse.getWriter().write(form);//直接将完整的表单html输出到页面
httpResponse.getWriter().flush();
} catch (Exception e) {
e.printStackTrace();
renderNull();
public void return_url() {
// 获取支付宝GET过来反馈信息
Map&String, String& map = AliPayApi.toMap(getRequest());
for (Map.Entry&String, String& entry : map.entrySet()) {
System.out.println(entry.getKey() + " = " + entry.getValue());
boolean verify_result = AlipaySignature.rsaCheckV1(map, AliPayApi.ALIPAY_PUBLIC_KEY, AliPayApi.CHARSET,
AliPayApi.SIGN_TYPE);
if (verify_result) {// 验证成功
// TODO 请在这里加上商户的业务逻辑程序代码
System.out.println("return_url 验证成功");
renderText("success");
System.out.println("return_url 验证失败");
renderText("failure");
} catch (AlipayApiException e) {
e.printStackTrace();
renderText("failure");
public void notify_url() {
// 获取支付宝POST过来反馈信息
Map&String, String& params = AliPayApi.toMap(getRequest());
for (Map.Entry&String, String& entry : params.entrySet()) {
System.out.println(entry.getKey() + " = " + entry.getValue());
boolean verify_result = AlipaySignature.rsaCheckV1(params, AliPayApi.ALIPAY_PUBLIC_KEY, AliPayApi.CHARSET,
AliPayApi.SIGN_TYPE);
if (verify_result) {// 验证成功
// TODO 请在这里加上商户的业务逻辑程序代码
System.out.println("notify_url 验证成功succcess");
renderText("success");
System.out.println("notify_url 验证失败");
renderText("failure");
} catch (AlipayApiException e) {
e.printStackTrace();
renderText("failure");
* 将异步通知的参数转化为Map
* @param request
public static Map&String, String& toMap(HttpServletRequest request) {
Map&String, String& params = new HashMap&String, String&();
Map&String, String[]& requestParams = request.getParameterMap();
for (Iterator&String& iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i & values. i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
// 乱码解决,这段代码在出现乱码时使用。
// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
此项目源码【】
下载部署如果没有做任何修改默认的分别为:
测试地址:http://域名或者IP/alipay/wapPay
回跳地址:http://域名或者IP/alipay/return_url
通知地址:http://域名或者IP/alipay/notify_url
wap支付页面
输入支付账号以及密码
输入支付密码
记录学习的点滴,以此勉励不断奋斗的自己???
如果对你有帮助记得点喜欢
专注Android、微信开发。公众号javenlife
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
支付宝简介文档 (适用于ydm-java接口与后台,如有误入,但愿也能给您带来帮助) 此文档写于2017年3月,只能说明此时该文档适用。使用前请查看以下接口支付宝是否提供。 App支付产品 批量付款到支付宝账户 (链接如有发生变化,请在官方文档中寻找此产品,一般情况下,产品...
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式...
此项目已开源 赶快来围观 Start支持下吧 【客户端开源地址-JPay】【服务端端开源地址-在com.javen.alipay 包名下 】 上一篇详细介绍了微信APP支付点击这里 此篇文章来详细介绍下支付宝APP支付 目录 1、支付宝与微信对比(申请、费率、结算周期) 2...
重阳节之后每天的阳光都让人出乎意料,“天无三日晴”的魔咒似乎被打破,连续好几日都是大好阳光。每天看到一眼太阳刚升起,匆匆路过还未感受到太阳的温度,就已坐到办公室,开始一天的忙碌。 难得有这么好的秋日,心里想象着去看看红彤彤的枫叶,去看看金黄黄的银杏,去感受一下秋风与秋意,秋...
你的自由是否如庄子般“视功名如粪土,在天地间逍遥”无拘无束。 你的自由是否如李白般“天生我材必有用,千金散尽还复来”洒脱不羁。 你的自由是否如陶渊明般“不为五斗米折腰,寄情于田园之间”悠闲自在。 为了我们所谓的自由,你可愿意归隐山林,日出而作,日落而息。当你想通的时候,哪有...
01 你明明搬不动这个箱子,却爱逞强的说&没关系我自己可以的&。你明明不会喝酒,应酬时还是要礼貌的讲&这杯我先干了&。你明明很在意他对别的女孩好,但总装作懂事的笑笑说&没事呀我不会介意&。 你自己清楚,你从来都不是那样大度懂事的姑娘,却爱逞着强把自己包装成潇洒小姐,于是他们...
一个忧郁的独思恋者,一个混沌的傻子,这是好友给我的评论! 提笔记录的不只是生活,刻印在纸张上的文案是心灵的寄托。 我们每个人都希望被别人理解,但最懂本心的永远只有自己。优秀者的背后是艰辛刻苦,眼前却是柳暗花明,眼界有多雄浑开阔,生命的愿景就有多么高尚,美丽的身边总归是有见地...浅谈三方支付之微信支付集成 - 简书
浅谈三方支付之微信支付集成
下面所写的微信支付SDK和之前写的支付宝的SDK支付,都是我在项目集成时的步骤,在写文章时,我又创建了一个小的demo进行截图说明的,有什么不恰当的地方,还请各位大神指出,共同学习进步,该文章只是作为集成参考,每个公司的需求不一样,服务器返回的数据不一样,具体还是请参考官方的文档.
微信支付的前期工作和支付宝差不多,注册认证,填写申请资料,这些一般是产品做好的工作.我们关心的就是appID,apiKey和商户账号了. SDK的下载地址:
下载了SDK后开始一步步集成微信支付了.集成SDK所需要的.
Paste_Image.png
添加到项目中后直接运行下,发现没有报错.官方文档里也没看见让添加依赖文件,我的项目中因为集成了别的SDK,添加的依赖文件挺多的,也没有报错.但是在我把工具类写好后编译下就开始狂报错了,
一般需要的依赖库,请根据具体情况添加
SystemConfiguration.framework
libsqlite3.0.tbd
CoreTelephony.framework
libc++.tbd
添加依赖库的截图
Paste_Image.png
完事后可以设置项目的APPID,请看截图
Paste_Image.png
设置白名单
// 把info.plist文件 source code打开,把下面这段话直接复制进去就可以了
// 说明, 如果在项目中没有做是否能打开微信的判断,不加白名单也是可以的,但是这样不够严谨.
&key&LSApplicationQueriesSchemes&/key&
&string&weixin&/string&
&string&wechat&/string&
// 不加白名单做微信是否能够打开的判断在控制台会报警告
-canOpenURL: failed for URL: "weixin://app/wxfc87/" - error: "This app is not allowed to query for scheme weixin"
Paste_Image.png
基本工作已经准备完毕,现在开始集成代码.
1.在AppDelegate里注册
//导入头文件:
#import "WXApi.h"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[WXApi registerApp:@"你们公司的appID"];
return YES;
// 回调处理
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
// 此处设置了代理,需要遵守协议: WXApiDelegate,并实现 - (void)onResp:(BaseResp *) 方法
return [WXApi handleOpenURL:url delegate:self];
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
// 此处设置了代理,需要遵守协议: WXApiDelegate 并实现 - (void)onResp:(BaseResp *) 方法
[WXApi handleOpenURL:url delegate:self];
return YES;
2.支付代码:
每个公司服务器返回的数据不一样,可能在集成的时候回有差异,先看下官方demo中的代码.官方代码中集成的东西比较多,查找起来不是特别的方便,请看截图
Paste_Image.png
下面是官方demo中的代码,里面会用到时间戳,随机字符串和加密后的签名,这些东西有些公司是服务器直接做好返回给你的,有些公司不是,比如,我们公司
+ (NSString *)jumpToBizPay {
//============================================================
// V3&V4支付流程实现
// 注意:参数配置请查看服务器端Demo
// 更新时间:日
//============================================================
NSString *urlString
= @"http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=ios";
//解析服务端返回json数据
//加载一个NSURL对象
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
//将请求的url数据放到NSData对象中
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
if ( response != nil) {
NSMutableDictionary *dict = NULL;
//IOS5自带解析类NSJSONSerialization从response中解析出数据放到字典中
dict = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];
NSLog(@"url:%@",urlString);
if(dict != nil){
NSMutableString *retcode = [dict objectForKey:@"retcode"];
if (retcode.intValue == 0){
NSMutableString *stamp
= [dict objectForKey:@"timestamp"];
//调起微信支付
PayReq* req
= [[[PayReq alloc] init]autorelease];
req.partnerId
= [dict objectForKey:@"partnerid"];
// 商户账生成号
req.prepayId
= [dict objectForKey:@"prepayid"];
// 支付订单,有公司服务器生成
req.nonceStr
= [dict objectForKey:@"noncestr"]; // 32位的随机字符创
req.timeStamp
= stamp.intV // 时间戳
req.package
= [dict objectForKey:@"package"];
固定写法 @"Sign=WXPay"
= [dict objectForKey:@"sign"];
[WXApi sendReq:req];
//日志输出
NSLog(@"appid=%@\npartid=%@\nprepayid=%@\nnoncestr=%@\ntimestamp=%ld\npackage=%@\nsign=%@",[dict objectForKey:@"appid"],req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign );
return @"";
return [dict objectForKey:@"retmsg"];
return @"服务器返回错误,未获取到json对象";
return @"服务器返回错误";
代理 WXApiDelegate
#pragma mark - WXApiDelegate
- (void)onResp:(BaseResp *)resp{
// 支付成功后,返回你的app会调用该方法,可以在这里做相应的处理
if([resp isKindOfClass:[PayResp class]]){
//支付返回结果,实际支付结果需要去微信服务器端查询
NSString *strMsg =
switch (resp.errCode) {
case WXSuccess:
strMsg = @"支付结果:成功!";
NSLog(@"支付成功-PaySuccess,retcode = %d", resp.errCode);
strMsg = [NSString stringWithFormat:@"支付结果:失败!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
NSLog(@"错误,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
以上是官方demo,如果你们公司的服务器把什么都做好了,照着实现就可以了,但是,但是,为什么但是呢?如果后台有些时间没做,就麻烦一点了.比如,时间戳,随机字符和签名加密都需要自己做的时候,加密用的是md5加密
// md5加密
导入头文件:#import &CommonCrypto/CommonCrypto.h&
// 加密代码
@param input 需要加密的字符串
@return 加密后生成的字符串
+ (NSString *) md5: (NSString *) input {
const char *cStr = [input UTF8String];
unsigned char digest[CC_MD5_DIGEST_LENGTH];
CC_MD5( cStr, (CC_LONG)strlen(cStr), digest );
NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for(int i = 0; i & CC_MD5_DIGEST_LENGTH; i++)
[output appendFormat:@"%02x", digest[i]];
[NSString stringWithString: output];
先看下随机数,官方给的随机数算法
// 官方算法解释
微信支付API接口协议中包含字段nonce_str,主要保证签名不可预测。我们推荐生成随机数算法如下:调用随机数函数生成,将得到的值转换为字符串。
// 具体在做的时候,我查了写资料,有些大神是用时间生成的,也有用uid(有的公司是token)生成的,我用的是第一种
随机字符串
@return 生成一个32位的字母大小的随机字符串
+ (NSString *)randomNum{
NSString *timeStamp = [NSString stringWithFormat:@"%f", [[NSDate date] timeIntervalSince1970]];
// 调用md5加密算法, WXPayTools是我创建的工具类名
timeStamp = [WXPayTools md5:timeStamp];
return [timeStamp uppercaseString];
// 获取当前时间,这个是C语言获取的
time(&now);
NSString *timestamp = [NSString stringWithFormat:@"%ld", now];
// OC的获取时间戳的方法
NSTimeInterval interval = [[NSDate date] timeIntervalSince1970];
签名的加密,简单来说就是把需要传的参数按照字典的格式进行排序,然后拼接,再然后添加key字典,就是添加到@"key=排序后拼接的字符串".排序的时候尽量不要手动排序,避免出错.
官方给的解释
签名生成的通用步骤如下:
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
◆ 参数名ASCII码从小到大排序(字典序);
◆ 如果参数的值为空不参与签名;
◆ 参数名区分大小写;
◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
key设置路径:微信商户平台(pay.weixin.qq.com)--&账户设置--&API安全--&密钥设置
假设传送的参数如下:
wxd930ea5d5a258f4f
device_info:
nonce_str:
ibuaiVcKdpRxkhJA
第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:
stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=&nonce_str=ibuaiVcKdpRxkhJA";
第二步:拼接API密钥:
stringSignTemp="stringA&key=c09247ec02edce69f6a2d"
sign=MD5(stringSignTemp).toUpperCase()="9A0AA9CF3B7"
下面是我demo中对签名排序后加密的做法
// 获取当前时间
time(&now);
NSString *timestamp = [NSString stringWithFormat:@"%ld", now];
// 随机字符串
NSString *nonceStr = [[WXPayTools md5:timestamp] uppercaseString];
NSDictionary *para = @{
@"appid" : appID,
@"noncestr" : nonceStr,
@"package" : @"Sign=WXPay",
@"partnerid" : WXpartnerId,
@"prepayid" : prepayid,
@"timestamp" : timestamp
NSMutableString *contentString = [NSMutableString string];
NSArray *keys = [para allKeys];
// 按字母排序
NSArray *sortedArry = [keys sortedArrayUsingComparator:^NSComparisonResult(id
_Nonnull obj1, id
_Nonnull obj2) {
return [obj1 compare:obj2 options:NSNumericSearch];
// 拼接字符串
for (NSString *categoryId
in sortedArry) {
if (![[para objectForKey:categoryId] isEqualToString:@""] && ![categoryId isEqualToString:@"sign"] && ![categoryId isEqualToString:@"key"]) {
[contentString appendFormat:@"%@=%@&", categoryId, para[categoryId]];
// 添加key字段
[contentString appendFormat:@"key=%@", apiKey];
// 加密生成字符串
// WXPayTools 是我创建的工具类名
NSString *sign = [WXPayTools md5:contentString];
上面的工作都做完后,就可以进行支付宝支付了.支付完成后的操作可以在代理方法里面做
PayReq *req = [[PayReq alloc] init];
req.partnerId = WXpartnerId;
req.prepayId =
req.nonceStr = nonceS
req.timeStamp =
timestamp.intV
req.package = @"Sign=WXPay";
req.sign =
[WXApi sendReq:req];
以上是我在做微信支付时用到的一些,上述内容都是本人新建一个demo后全部手动敲出来的,是想方便和大家交流学习,大神们轻喷,demo我上传到了github上了,只是一个样板.github的链接:
有种烈日灼身的错觉
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注
09:45字数 61697阅读 3316评论 2喜欢 85 用到的组件 1、通过CocoaPods安装 项目名称 项目信息 AFNetworking 网络请求组件 FM...
用到的组件1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SDWebImage多个缩略图缓存组件 UICKeyChainStore存放用户账号密码组件 Reachability监测网络状态 DateTools友好...
实现支付宝支付的准备工作: 1.向支付宝签约,成为支付宝的商户 签约完成后,支付宝会提供一些必要的数据给我们 商户ID:partner 账号ID:seller 即支付宝账号 签约需要营业执照 2.获取支付相关的 私钥和密钥,这两个东西为了数据安全 上面这几个东西只要签约成功...
【资料库】是您选择的一个文件夹。每个资料库可以有一套不同的标签。建议您把同一类文件,放在同一个【资料库】里,方便您以后“贴标签”。
对着空调吹, 惬意加迷醉, 不知不觉已入睡, 梦圆与谁?
D42 阿尔法号 阿基米德舱 F12 兰建华 打卡 [今日感悟] 这两天思绪很混乱,时好时坏,时而无感。 本来前一刻还很积极下一秒就变得消极和偏激。 我还是放不下第四十天打的那张卡,这几天的感受,一会坦然,一会担心,一会愤怒,一会无奈。坦然自己的真实,担心弟弟的成长,不知道...
欢迎关注幼儿说,用简书的妈咪,都是有品味的母亲 暑假已经过了大半个月,你家孩子是玩耍放任了大半个月?还是高强度继续学习?抑或是半休息半学习地度过?无论是学龄前的孩子,还是学龄后的孩子,都应该关注这个问题。 学习VS玩耍的震撼数据 约翰.霍普金斯大学的社会学家卡尔.亚历山大曾...
知道这事后 其实说真,没有说被惊到,那是因为知道日本的领导人一直都是这么厚颜无耻,从未被超越,颠倒是非黑白这种事,对他们来说再正常不过,我又何必一惊一乍。 他们否认南京大屠杀,说都是中国官兵杀的中国人,首先当时的确有一部分中国败兵杀的中国人,但是有三十多万同胞被日本人杀的是...

我要回帖

更多关于 paypal和支付宝的区别 的文章

 

随机推荐