一.准备工作

>
1. 登录第三方支付宝开放平台
点击链接支付宝开放平台 (https://open.alipay.com/index.htm)
2. 开发前一定要阅读支付宝官方文档中心开发步骤
3. 下载相应的开发工具包(在文档中心>资源下载)
压缩包下的“支付宝钱包支付接口开发包”中即有Andoid使用支付宝的JAR和Demo

二.开发步骤

  • 创建支付宝应用(管理中心>我的应用)

备注:申请通过后会获得:合作者身份ID(PID),该ID在项目配置中需要用到

  • 完善信息(上传应用图标、说明文档)
  • 配置应用环境

根据API文档详解进行配置(引用自API文档)

第一步 生成RSA密钥
特别注意事项(坑点)
下载支付宝的官网之后生成你所需要的密钥及PKCS8转码一定要小心

生成方式一(推荐):使用支付宝提供的一键生成工具(内附使用说明)

Windows:下载 (在API文档中点击下载)
MAC OSX:下载
解压打开文件夹,直接运行“支付宝RAS密钥生成器
SHAwithRSA1024_V1.0.bat”(WINDOWS)
或“SHAwithRSA1024_V1.0.command”(MACOSX),点
击“生成RSA密钥”,会自动生成公私钥,然后点击“打开文件位
置”,即可找到工具自动生成的密钥。

注意:工具不支持含中文或空格的路径,请下载到英文目录下使用。

生成方式二:也可以使用OpenSSL工具命令生成(详细参考API)

开发者登录开放平台后,找到并进入应用。

点击“RSA(SHA1)密钥”处的“设置开发者公钥”(如已设置则显示“查看开发者公钥”,可修改),将公钥文件去除头尾、换行和空格,仅需填入字符串。

例如转换前公钥pem文件格式:

 -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQWiDVZ7XYxa4CQsZoB3n7bfxLDkeGKjyQPt2FUtm4TWX9OYrd523iw6UUqnQ+Evfw88JgRnhyXadp+vnPKP7unormYQAfsM/CxzrfMoVdtwSiGtIJB4pfyRXjA+KL8nIa2hdQy5nLfgPVGZN4WidfUY/QpkddCVXnZ4bAUaQjXQIDAQAB-----END PUBLIC KEY-----

转换后得到的字符串为:

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQWiDVZ7XYxa4CQsZoB3n7bfxLDkeGKjyQPt2FUtm4TWX9OYrd523iw6UUqnQ+Evfw88JgRnhyXadp+vnPKP7unormYQAfsM/CxzrfMoVdtwSiGtIJB4pfyRXjA+KL8nIa2hdQy5nLfgPVGZN4WidfUY/QpkddCVXnZ4bAUaQjXQIDAQAB

第三步 获取支付宝公钥

应用上线后点击“查看支付宝公钥”,即可获取支付宝公钥,用于支付宝返回数据的验签。

对于支付宝公钥,看到的是一个字符串,如下:

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB

如果需要使用文件方式(如使用服务端SDK的PHP/.NET版本)读取支付宝公钥,需要在头尾加入标示后保存至文件,文件内容如下:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB
-----END PUBLIC KEY-----
  1. 添加应用功能(详细参考API)
    开发者在开发过程中,可以添加自己需要的功能到待申请功能列表。
    。。。
  2. 上线应用的使用(详细参考API)
    应用开发完成后,可申请上线,上线成功后,状态变为已上线,这个状态下的应用能够调用生产环境的接口。

三.代码:

  1. AndroidManifest.xml 修改 (权限、界面、服务等申明)
<uses-sdk
        android:minSdkVersion="4"android:targetSdkVersion="8"tools:ignore="OldTargetApi" /><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><supports-screens
        android:anyDensity="true"android:largeScreens="true"android:normalScreens="true"android:resizeable="true"android:smallScreens="true" /><application
        android:allowBackup="true"android:label="@string/app_name"android:theme="@android:style/Theme.Light.NoTitleBar" ><activity
            android:name="com.alipay.sdk.pay.demo.PayDemoActivity"android:icon="@drawable/msp_icon"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity
            android:name="com.alipay.sdk.pay.demo.H5PayDemoActivity"android:configChanges="orientation|keyboardHidden|navigation"android:exported="false"android:screenOrientation="behind" ></activity><!-- alipay sdk begin --><activity
            android:name="com.alipay.sdk.app.H5PayActivity"android:configChanges="orientation|keyboardHidden|navigation|screenSize"android:exported="false"android:screenOrientation="behind"android:windowSoftInputMode="adjustResize|stateHidden" ></activity><!-- alipay sdk end --></application>

2.获取开发所需要的参数数据
PayDemoActivity主类

public class PayDemoActivity extends FragmentActivity {// 商户PIDpublic static final String PARTNER = "";// 商户收款账号public static final String SELLER = "";// 商户私钥,pkcs8格式public static final String RSA_PRIVATE = "";// 支付宝公钥public static final String RSA_PUBLIC ="";private static final int SDK_PAY_FLAG = 1;@SuppressLint("HandlerLeak")private Handler mHandler = new Handler() {@SuppressWarnings("unused")public void handleMessage(Message msg) {switch (msg.what) {case SDK_PAY_FLAG: {PayResult payResult = new PayResult((String) msg.obj);/*** 同步返回的结果必须放置到服务端进行验证(验证的规则请看https://doc.open.alipay.com/doc2/* detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&* docType=1) 建议商户依赖异步通知*/String resultInfo = payResult.getResult();// 同步返回需要验证的信息String resultStatus = payResult.getResultStatus();// 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档if (TextUtils.equals(resultStatus, "9000")) {Toast.makeText(PayDemoActivity.this, "支付成功", Toast.LENGTH_SHORT).show();} else {// 判断resultStatus 为非"9000"则代表可能支付失败// "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)if (TextUtils.equals(resultStatus, "8000")) {Toast.makeText(PayDemoActivity.this, "支付结果确认中", Toast.LENGTH_SHORT).show();} else {// 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误Toast.makeText(PayDemoActivity.this, "支付失败", Toast.LENGTH_SHORT).show();}}break;}default:break;}};};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.pay_main);}/*** call alipay sdk pay. 调用SDK支付* */public void pay(View v) {if (TextUtils.isEmpty(PARTNER) || TextUtils.isEmpty(RSA_PRIVATE) || TextUtils.isEmpty(SELLER)) {new AlertDialog.Builder(this).setTitle("警告").setMessage("需要配置PARTNER | RSA_PRIVATE| SELLER").setPositiveButton("确定", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialoginterface, int i) {//finish();}}).show();return;}String orderInfo = getOrderInfo("测试的商品", "该测试商品的详细描述", "0.01");/*** 特别注意,这里的签名逻辑需要放在服务端,切勿将私钥泄露在代码中!*/String sign = sign(orderInfo);try {/*** 仅需对sign 做URL编码*/sign = URLEncoder.encode(sign, "UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}/*** 完整的符合支付宝参数规范的订单信息*/final String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + getSignType();Runnable payRunnable = new Runnable() {public void run() {// 构造PayTask 对象PayTask alipay = new PayTask(PayDemoActivity.this);// 调用支付接口,获取支付结果String result = alipay.pay(payInfo, true);Message msg = new Message();msg.what = SDK_PAY_FLAG;msg.obj = result;mHandler.sendMessage(msg);}};// 必须异步调用Thread payThread = new Thread(payRunnable);payThread.start();}/*** get the sdk version. 获取SDK版本号* */public void getSDKVersion() {PayTask payTask = new PayTask(this);String version = payTask.getVersion();Toast.makeText(this, version, Toast.LENGTH_SHORT).show();}/*** 原生的H5(手机网页版支付切natvie支付) 【对应页面网页支付按钮】* * @param v*/public void h5Pay(View v) {Intent intent = new Intent(this, H5PayDemoActivity.class);Bundle extras = new Bundle();/*** url是测试的网站,在app内部打开页面是基于webview打开的,demo中的webview是H5PayDemoActivity,* demo中拦截url进行支付的逻辑是在H5PayDemoActivity中shouldOverrideUrlLoading方法实现,* 商户可以根据自己的需求来实现*/String url = "http://m.taobao.com";// url可以是一号店或者淘宝等第三方的购物wap站点,在该网站的支付过程中,支付宝sdk完成拦截支付extras.putString("url", url);intent.putExtras(extras);startActivity(intent);}/*** create the order info. 创建订单信息* */private String getOrderInfo(String subject, String body, String price) {// 签约合作者身份IDString orderInfo = "partner=" + "\"" + PARTNER + "\"";// 签约卖家支付宝账号orderInfo += "&seller_id=" + "\"" + SELLER + "\"";// 商户网站唯一订单号orderInfo += "&out_trade_no=" + "\"" + getOutTradeNo() + "\"";// 商品名称orderInfo += "&subject=" + "\"" + subject + "\"";// 商品详情orderInfo += "&body=" + "\"" + body + "\"";// 商品金额orderInfo += "&total_fee=" + "\"" + price + "\"";// 服务器异步通知页面路径orderInfo += "&notify_url=" + "\"" + "http://notify.msp.hk/notify.htm" + "\"";// 服务接口名称, 固定值orderInfo += "&service=\"mobile.securitypay.pay\"";// 支付类型, 固定值orderInfo += "&payment_type=\"1\"";// 参数编码, 固定值orderInfo += "&_input_charset=\"utf-8\"";// 设置未付款交易的超时时间// 默认30分钟,一旦超时,该笔交易就会自动被关闭。// 取值范围:1m~15d。// m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。// 该参数数值不接受小数点,如1.5h,可转换为90m。orderInfo += "&it_b_pay=\"30m\"";// extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付// orderInfo += "&extern_token=" + "\"" + extern_token + "\"";// 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空orderInfo += "&return_url=\"m.alipay.com\"";// 调用银行卡支付,需配置此参数,参与签名, 固定值 (需要签约《无线银行卡快捷支付》才能使用)// orderInfo += "&paymethod=\"expressGateway\"";return orderInfo;}/*** get the out_trade_no for an order. 生成商户订单号,该值在商户端应保持唯一(可自定义格式规范)* */private String getOutTradeNo() {SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss", Locale.getDefault());Date date = new Date();String key = format.format(date);Random r = new Random();key = key + r.nextInt();key = key.substring(0, 15);return key;}/*** sign the order info. 对订单信息进行签名* * @param content*            待签名订单信息*/private String sign(String content) {return SignUtils.sign(content, RSA_PRIVATE);}/*** get the sign type we use. 获取签名方式* */private String getSignType() {return "sign_type=\"RSA\"";}}

3.跳转到支付页面
H5PayDemoActivity类

public class H5PayDemoActivity extends Activity {private WebView mWebView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Bundle extras = null;try {extras = getIntent().getExtras();} catch (Exception e) {finish();return;}if (extras == null) {finish();return;}String url = null;try {url = extras.getString("url");} catch (Exception e) {finish();return;}if (TextUtils.isEmpty(url)) {// 测试H5支付,必须设置要打开的url网站new AlertDialog.Builder(H5PayDemoActivity.this).setTitle("警告").setMessage("必须配置需要打开的url 站点,请在PayDemoActivity类的h5Pay中配置").setPositiveButton("确定", new OnClickListener() {public void onClick(DialogInterface arg0, int arg1) {finish();}}).show();}super.requestWindowFeature(Window.FEATURE_NO_TITLE);LinearLayout layout = new LinearLayout(getApplicationContext());LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);layout.setOrientation(LinearLayout.VERTICAL);setContentView(layout, params);mWebView = new WebView(getApplicationContext());params.weight = 1;mWebView.setVisibility(View.VISIBLE);layout.addView(mWebView, params);WebSettings settings = mWebView.getSettings();settings.setRenderPriority(RenderPriority.HIGH);settings.setSupportMultipleWindows(true);settings.setJavaScriptEnabled(true);settings.setSavePassword(false);settings.setJavaScriptCanOpenWindowsAutomatically(true);settings.setMinimumFontSize(settings.getMinimumFontSize() + 8);settings.setAllowFileAccess(false);settings.setTextSize(WebSettings.TextSize.NORMAL);mWebView.setVerticalScrollbarOverlay(true);mWebView.setWebViewClient(new MyWebViewClient());mWebView.loadUrl(url);}@Overridepublic void onBackPressed() {if (mWebView.canGoBack()) {mWebView.goBack();} else {finish();}}@Overridepublic void finish() {super.finish();}@Overridepublic void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);}private class MyWebViewClient extends WebViewClient {@Overridepublic boolean shouldOverrideUrlLoading(final WebView view, String url) {if (!(url.startsWith("http") || url.startsWith("https"))) {return true;}final PayTask task = new PayTask(H5PayDemoActivity.this);final String ex = task.fetchOrderInfoFromH5PayUrl(url);if (!TextUtils.isEmpty(ex)) {System.out.println("paytask:::::" + url);new Thread(new Runnable() {public void run() {System.out.println("payTask:::" + ex);final H5PayResultModel result = task.h5Pay(ex, true);if (!TextUtils.isEmpty(result.getReturnUrl())) {H5PayDemoActivity.this.runOnUiThread(new Runnable() {public void run() {view.loadUrl(result.getReturnUrl());}});}}}).start();} else {view.loadUrl(url);}return true;}}@Overrideprotected void onDestroy() {super.onDestroy();if (mWebView != null) {mWebView.removeAllViews();try {mWebView.destroy();} catch (Throwable t) {}mWebView = null;}}
}

4.其它的工具类,原封不动拷贝过去就好(参考demo)
Base64 类
SignUtils类
PayResult类

- 总结

开发流程:
第一步:
下载API开发文档后,即可获取官方Demo,该Demo中需要将审核通过后获取的PID替换,并且输入支付宝收款账户即可。
第二步:
官方Api开发文档中,存在一个openssl的文件夹,该文件夹主要是用于生成支付宝所需要用到的公钥以及私钥。打开该文件夹可以看到详细的生成方式,根据提示生成公钥及私钥,请注意,密钥需要经过pkcs8二次加密。
第三步:
将生成的公钥和私钥配置到Demo中。

第三方支付宝API应用流程相关推荐

  1. 支付宝API使用流程

    一.准备工作 〉1.下载开发包 https://b.alipay.com/order/productDetail.htm?productId=2014110308141993&tabId=4# ...

  2. Android 支付宝API使用流程

    一.准备工作 〉1.下载开发包 https://b.alipay.com/order/productDetail.htm?productId=2014110308141993&tabId=4# ...

  3. 对接转账到支付宝账户API接口流程步骤

    对接转账到支付宝API接口流程步骤 一.技术指导步骤指引 https://opensupport.alipay.com/support/codelab/detail/488/1445?ant_sour ...

  4. iOS开发之第三方支付支付宝支付教程,史上最新最全第三方支付宝支付方式实现、支付宝集成教程,支付宝实现流程

    本章项目demo: https://github.com/zhonggaorong/alipayDemo 支付宝支付大致流程为 : 1. 公司与支付宝进行签约 , 获得商户ID(partner)和账号 ...

  5. 第三方支付平台结算流程是什么样的?

    在电商发展的初期曾遇到过一个瓶颈,那就是买卖双方对彼此互不信任,互联网市场中的交易是无形的,大家对对方的信息一无所知,买家害怕自己给了钱没收到货,卖家害怕自己给了货没收到钱,由于缺少这种信任,所以很难 ...

  6. 支付宝怎么提交html表单提交,支付宝支付全流程

    支付宝沙箱环境 蚂蚁沙箱环境(Beta)是协助开发者进行接口功能开发及主要功能联调的辅助环境.沙箱环境模拟了开放平台部分产品的主要功能和主要逻辑(当前沙箱支持产品请参考"沙箱支持产品列表&q ...

  7. 更新一波,微信第三方开发平台授权流程

    最近一直忙于微信三方开发平台开发,更新一下,做个记录,微信第三方开发平台授权流程示例: 先看授权流程要拿到的结果: 照例先给出微信授权流程官网页面:https://open.weixin.qq.com ...

  8. Spring Security技术栈学习笔记(十三)Spring Social集成第三方登录验证开发流程介绍

    开发第三方登录,我们必须首先要了解OAuth协议(本文所讲述的OAuth协议指的是OAuth2协议),本文首先简单介绍OAuth协议,然后基于Spring Social来阐述开发第三方登录需要做哪些准 ...

  9. 关于支付宝的支付流程

    关于支付 现在的电商项目已经非常火爆了,随之而来的像支付宝,微信等第三方支付也非常的火爆,所以这里简单的说一下支付宝的支付流程. 支付步骤 工作前准备 首先我们需要在蚂蚁金服官网上面注册一个开发者账号 ...

最新文章

  1. 3559A sdk卡
  2. Opencv 实现图像的离散傅里叶变换(DFT)、卷积运算(相关滤波)
  3. php7.2 swoole_loader,用什么方法可以让swoolec-loader支持php7.3?
  4. bzoj1084: [SCOI2005]最大子矩阵
  5. es6 --- 使用proxy对数据进行劫持
  6. 剑指offer python实现_剑指offer系列python实现 日更(三)
  7. 剪贴板是计算机系统,剪贴板在哪里,手把手教你如何打开电脑剪贴板
  8. ListView列表项View复用--ViewHolder模式
  9. Apple Developer苹果签名工具
  10. c语言1117查找数组元素,路雪军 Carl
  11. 线程池提交执行任务中execute()方法和submit()的区别
  12. 简析市场营销中的六大数据科学用例
  13. css文字背景蒙版_使用CSS创建蒙版的背景效果
  14. 港科资讯 | 香港科大与瑞士百达资产管理联合调查:香港个人投资者ESG意识及相关投资经验较低 惟投资意欲强劲...
  15. 谷歌浏览器安全证书不受信任_windows7系统下谷歌浏览器提示该网站的安全证书不受信任如何解决...
  16. 【Java开发】 Spring 09 :Spring Data REST 实现并访问简单的超媒体服务
  17. Dell技术支持年度笑话总结
  18. Java GUI(快递信息管理系统)
  19. unity基础(8)——3D场景添加音频
  20. python 仪表盘实现_使用python绘制一个仪表盘显示

热门文章

  1. 关于De-pCode在线工具失效的问题
  2. png怎么转换成jpg格式?如何转换照片格式为jpg?
  3. UNIX 系统家族树的详细历史(图)
  4. 家用NAS安装大礼包:PVE+OMV+常用soft详细安装教程
  5. 根据经纬度定位百度地图(带图片的)
  6. 有一天我们可不可以这样相爱……
  7. 那曲虫草价目表2022
  8. 流行手机谜语大解密 (爱情诗)
  9. GitLab 中编辑 Markdown 写README技巧
  10. LDPC编码原理概述